#python #pandas #list #match
#python #pandas #Список #сопоставьте
Вопрос:
У меня есть фрейм данных со списком в одном столбце, и я хочу сопоставить все элементы в этом списке со вторым фреймом данных. Затем сопоставленные значения следует добавить (в виде списка) в новый столбец в первом фрейме данных.
data = {'froots': [['apple','banana'], ['apple','strawberry']]
}
df1 = pd.DataFrame(data)
data = {'froot': ['apple','banana','strawberry'],
'age': [2,3,5]
}
df2 = pd.DataFrame(data)
DF1
index fruits
1 ['apple','banana']
2 ['apple','strawberry']
DF2
index fruit age
1 apple 2
2 banana 3
3 strawberry 5
Новый DF1
index froots age
1 ['apple','banana'] [2,3]
2 ['apple','strawberry'] [2,5]
У меня есть простое решение, которое занимает слишком много времени:
age = list()
for index,row in df1.iterrows():
numbers = row.froots
tmp = df2[['froot','age']].apply(lambda x: x['age'] if x['froot'] in numbers else None, axis=1).dropna().tolist()
age.append(tmp)
df1['age'] = age
Возможно, есть более быстрое решение этой проблемы?
Заранее спасибо!
Комментарии:
1. Я хотел бы верить, что этот процесс может быть быстрее в обычном python, а затем прочитать его обратно в pandas. вы объединяете элементы в списки, поэтому никаких вычислений как таковых нет.
Ответ №1:
Используйте понимание lsit со словарем, созданным df2
, и добавьте новые значения в список, если они существуют в словаре, протестированном if
:
d = df2.set_index('froot')['age'].to_dict()
df1['ag1e'] = df1['froots'].apply(lambda x: [d[y] for y in x if y in d])
print (df1)
froots ag1e
0 [apple, banana] [2, 3]
1 [apple, strawberry] [2, 5]