У меня есть два кадра данных следующим образом. Второй столбец каждого фрейма данных имеет тип объекта. Они содержат список.
DF1
ID, WORDLIST, TAGS
1 air, water, fire []
2 bulb, light, ray []
3 chair table []
DF2
TAG WORDLIST
A water, ice, liquid
B bulb, glass, ray
C water, fire
D lock, key
Теперь мне нужно сравнить эти фреймы данных. Для каждой строки в DF1 мне нужно проверить все строки в DF2. Если в списке слов из DF1 и DF2 есть общие слова, мне нужно назначить тег из DF2.
Мой результат должен выглядеть так:
Result : Updated DF1
id1, WORDLIST, TAGS
1 air, water, fire A, C
2 bulb, light, ray B
3 chair, table <Empty>
EDIT Я достиг этого с следующий код
import pandas as pd
data = [
{'ID':1,'WORDLIST': ['air', 'water', 'fire'] , 'TAGS' : []},
{'ID':2, 'WORDLIST': ['bulb', 'light', 'ray'] , 'TAGS' : [] },
{'ID':3,'WORDLIST':['chair', 'table'], 'TAGS' : []}
]
df1 = pd.DataFrame.from_records(data)
data = [
{'TAG':'A','WORDLIST': ['water', 'ice', 'liquid']},
{'TAG':'B', 'WORDLIST': ['bulb', 'glass', 'ray'] },
{'TAG':'C','WORDLIST':['water', 'fire']},
{'TAG':'D','WORDLIST':['lock', 'key']}
]
df2 = pd.DataFrame.from_records(data)
print("DF1", df1)
print("DF2", df2)
def getTagForList(df1words):
tags=[]
for index, row in df2.iterrows():
df2words = row['WORDLIST']
if(bool(set(df1words).intersection(df2words) )):
tags.append(row['TAG'])
return tags
for index, row in df1.iterrows():
tags = getTagForList(row['WORDLIST'])
print(tags)
df1.at[index,'TAGS']=tags
print("Updated DF1", df1)
Но есть ли лучшее и более чистое решение для этого, которое является более эффективным? Можем ли мы избежать повторения одного фрейма данных для всех строк другого фрейма данных?