Найдите число внутри списка в ячейке панды и верните соответствующее строковое значение из второго DF - PullRequest
0 голосов
/ 29 сентября 2019

(для ясности я отредактировал имя первого столбца в label_df)

У меня есть два кадра данных: train_df и tags_df. В train_df есть целые числа, которые отображаются на имена атрибутов в label_df. Я хотел бы найти каждое число в данной ячейке train_df и вернуть в соседнюю ячейку соответствующее имя атрибута из label_df.

Так, например, первое наблюдение в train_df имеет attribute_ids 147, 616 и813, которые соответствуют (в label_df) культуре :: французскому языку, тегу :: собакам, тегу :: мужчине. И я хотел бы поместить эти строки в одну ячейку в той же строке, что и соответствующие целые числа.

enter image description here

Я пробовал варианты функции ниже, но боюсь, что я не в порядке:

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

enter image description here

tags.csv

enter image description here

Я попробовал это от @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. который возвратил:

enter image description here

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Это супер уродливо, и однажды, надеюсь, раньше, чем позже, я смогу выполнить эту задачу элегантным способом, хотя до тех пор это то, что дало мне тот результат, который мне нужен.

разбить train_df ['attribute_ids'] на свои собственные ячейку / столбец

helper_df = train_df['attribute_ids'].str.split(expand=True)

объединить train_df с helper_df, чтобы у меня был столбец id (это идентификаторы фотографий))

train_df2 = pd.concat([train_df, helper_df], axis=1)

удалить исходный столбец attribute_ids

train_df2.drop(columns = 'attribute_ids', inplace=True)

переименовать новые столбцы

train_df2.rename(columns = {0:'attr1', 1:'attr2', 2:'attr3', 3:'attr4', 4:'attr5', 5:'attr6',
                           6:'attr7', 7:'attr8', 8:'attr9', 9:'attr10', 10:'attr11'})

преобразоватьlabel_df в словарь

def create_file_mapping(df):
    mapping = dict()
    for i in range(len(df)):
        name, tags = df['attribute_id_num'][i], df['attribute_name'][i]
        mapping[str(name)] = tags
    return mapping

сопоставить и заменить номера тегов соответствующими именами тегов

train_df3 = train_df2.applymap(lambda s: my_map.get(s) if s in my_map else s)

создать новый столбец тегов наблюдений всписок объединенных значений

helper1['new_col'] = helper1[helper1.columns[0:10]].apply(lambda x: ','.join(x.astype(str)), axis = 1)
0 голосов
/ 29 сентября 2019

Надеюсь, это то, что вы ищете. Я уверен, что есть гораздо более эффективный способ использования поиска.

df['new_col'] = df['attribute_ids'].apply(lambda x: [labels_df[labels_df['attribute_id'] == i]['attribute_name'] for i in x])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...