Сопоставьте весь список со значениями из другого фрейма данных

#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]