Вопрос или проблема
(Я изменил название первого столбца в labels_df для ясности)
У меня есть два DataFrame: train_df и labels_df. В train_df есть целые числа, которые соответствуют именам атрибутов в labels_df. Я хотел бы найти каждое число в данной ячейке train_df и вернуть в соседней ячейке соответствующее имя атрибута из labels_df.
Я пробовал разные варианты функции ниже, но боюсь, что я сильно заблуждаюсь:
def my_mapping(df1, df2):
tags = df1['attribute_ids']
for i in tags.iteritems():
df1['new_col'] = df2.iloc[i]
return df1
Данные изначально из двух csv файлов:
train.csv
labels.csv
Я пробовал это от @Danny :
sample_train_df['attribute_ids'].apply(lambda x: [sample_labels_df[sample_labels_df['attribute_name'] == i]
['attribute_id_num'] for i in x])
*пожалуйста, обратите внимание – я запускаю указанный код на выборках каждого DF из-за времени выполнения на оригинальных DF, что вернуло:
Я создал свои данные.
train.csv
id,attrib
1,1 2 3
2,3 4 5
3,2 3 5
4,1 1 1
labels.csv
attrib_id,attrib_name
1,a
2,b
3,c
4,d
5,e
Прочитайте csv файлы и создайте df1 и df2
После этого используйте
def get_name(x):
result = []
for t in x.split(' '):
result.append(df2[df2['attrib_id']==int(t)]['attrib_name'].values[0])
return result
df1['attrib'] = df1['attrib'].apply(lambda x: get_name(x))
Это приведет к тому, что df1 будет выглядеть как
Я предполагаю, вы тоже делаете то же самое, когда упоминаете @Danny. Единственное важное здесь – преобразовать строку в целое число
Ответ или решение
Как выполнить привязку значений между двумя DataFrame в Pandas
В данной задаче существует два DataFrame: train_df
и labels_df
. Первая таблица содержит целочисленные идентификаторы атрибутов, которые нужно сопоставить с их строковыми названиями во второй таблице. В данном ответе мы рассмотрим, как извлечь идентификаторы из каждой ячейки, а затем сопоставить их с соответствующими атрибутами, используя библиотеку Pandas.
Установка и импорт необходимых библиотек
Для начала убедитесь, что у вас установлена библиотека Pandas. Если она еще не установлена, ее можно установить с помощью pip:
pip install pandas
Теперь импортируем нужные библиотеки:
import pandas as pd
Чтение данных из CSV файлов
Предположим, что у вас уже есть два CSV файла: train.csv
и labels.csv
. Давайте загрузим их в два DataFrame:
# Загрузка CSV файла train.csv
train_df = pd.read_csv('train.csv')
# Загрузка CSV файла labels.csv
labels_df = pd.read_csv('labels.csv')
Структура ваших DataFrame должна выглядеть следующим образом:
train_df:
id attrib
0 1 1 2 3
1 2 3 4 5
2 3 2 3 5
3 4 1 1 1
labels_df:
attrib_id attrib_name
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
Функция для привязки значений
Мы создадим функцию, которая будет разбирать строку идентификаторов в каждой ячейке attrib
и сопоставлять их с соответствующими строками в labels_df
. Мы будем использовать метод apply
, чтобы применить эту функцию к каждой ячейке.
def get_names(attribute_str):
# Разделяем строку и преобразуем идентификаторы в целые числа
ids = map(int, attribute_str.split())
# Используем библиотеку pandas для извлечения названий атрибутов
names = labels_df[labels_df['attrib_id'].isin(ids)]['attrib_name'].tolist()
return ' '.join(names) # Соединяем названия в одну строку
# Применяем функцию к столбцу attrib
train_df['attrib'] = train_df['attrib'].apply(get_names)
Результат
После выполнения вышеуказанного кода, ваш train_df
должен выглядеть следующим образом:
id attrib
0 1 a b c
1 2 c d e
2 3 b c e
3 4 a a a
Заключение
Теперь вы успешно привязали идентификаторы атрибутов к их названиям, используя два DataFrame в Pandas. Этот подход может быть легко адаптирован к большим наборам данных, а также использоваться для более сложной обработки данных. Общение между DataFrames обеспечивает гибкость и быстроту обработки, что делает Pandas мощным инструментом для анализа данных.