在列表中的元素上“合并”两个数据框?

时间:2019-06-20 15:39:25

标签: python pandas list merge

我想进行以下合并(很难用文字描述): 这是我的数据框

df8=pd.DataFrame({'names':[['Hans','Meier'],['Debby','Harry','Peter']]})
    names
 0 ['Hans','Meier']
 1 ['Debby','Harry','Peter']

df9=pd.DataFrame({'caller':['Hans','Meier','Debby','Harry','Peter'],'text':[['hi im hans'],['hi im meier'],['hi im debby'],['hi im harry'],['hi im peter']]})
df9.set_index(df9.caller, inplace = True)
df9.drop('caller', axis = 1, inplace = True)

 caller     text
 Hans        ['hi im hans']
 Meier       ['hi im meier']
 .
 .
 .

结果应该像这样

      names                  content
0 ['Hans','Meier']          ['hi im hans', 'hi im meier']
1 ['Debby','Harry','Peter'] ['hi im debby', 'hi im harry', 'hi im peter']

因此,如果人员是相应名称列表的元素,则df9中人员说的文本将出现在df8中。

我认为这是与this类似的问题 但我在那里看不到解决方案

我查看了有关连接,联接和合并的pandas文档,但也没有找到解决方案

4 个答案:

答案 0 :(得分:6)

这是一种方法

df9['text']=df9['text'].str[0]

l=[df9.loc[x,'text'].tolist() for x in df8.names]
Out[505]: [['hi im hans', 'hi im meier'], ['hi im debby', 'hi im harry', 'hi im peter']]

df9['cont']=l

答案 1 :(得分:5)

您可以在df9中查找值:

df8['contents'] = df8['names'].apply(lambda l: [df9['text'].loc[name] for name in l])

答案 2 :(得分:5)

使用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]]

答案 3 :(得分:0)

df8['content']= df8['names'].apply(lambda x: [df9.loc[name,'text'][0] for name in x])

如果在df9中找不到名称,则返回错误。您可以使用

使其更强大

df8['content']= df8['names'].apply(lambda x: [df9['text'].get(name)[0] if df9['text'].get(name) else None for name in x])

这将有一个列表,其中包含找到的每个名称的文本,None包含未找到的任何名称。

如果您使用df9的所有内容都是作为查找表,那么将其存储为字典会更合适,在这种情况下将是

df8['content']= df8['names'].apply(lambda x: [my_dict.get(name)[0] if my_dict.get(name) else None for name in x])