'merge' 2 Dataframes On Elements From List?
I want to do the following merge (hard to describe in words): This are my Dataframes df8=pd.DataFrame({'names':[['Hans','Meier'],['Debby','Harry','Peter']]}) names 0 ['Hans','
Solution 1:
Here is one way
df9['text']=df9['text'].str[0]
l=[df9.loc[x,'text'].tolist() forxin df8.names]
Out[505]: [['hi im hans', 'hi im meier'], ['hi im debby', 'hi im harry', 'hi im peter']]
df9['cont']=l
Solution 2:
Using s.get
:
d=df9.set_index('caller')['text']
df8=df8.assign(content=df8.names.apply(lambda x:[d.get(i) for i in x]))
print(df8)
names content
0 [Hans, Meier] [[hi im hans], [hi im meier]]1 [Debby, Harry, Peter] [[hi im debby], [hi im harry], [hi im peter]]
Solution 3:
You can lookup the values in df9
:
df8['contents'] = df8['names'].apply(lambda l: [df9['text'].loc[name] for name in l])
Solution 4:
df8['content']= df8['names'].apply(lambda x: [df9.loc[name,'text'][0] for name in x])
This return an error if there is a name that isn't found in df9
. You can make it more robust with
df8['content']= df8['names'].apply(lambda x: [df9['text'].get(name)[0] if df9['text'].get(name) else None for name in x])
This will have a list that contains the text for every name found, and None
for any name not found.
If all you're using df9
for is as a look-up table, then it would be more appropriate to store it as a dictionary, in which case it would be
df8['content']= df8['names'].apply(lambda x: [my_dict.get(name)[0] if my_dict.get(name) else None for name in x])
Post a Comment for "'merge' 2 Dataframes On Elements From List?"