【问题标题】:'merge' 2 dataframes on elements from list?在列表中的元素上“合并”2个数据框?
【发布时间】:2019-11-03 11:35:55
【问题描述】:

我想做以下合并(难以用语言描述): 这是我的数据框

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 文档,但也没有找到解决方案

【问题讨论】:

    标签: python pandas list merge


    【解决方案1】:

    这是一种方法

    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
    

    【讨论】:

    • @user11638654 啊,编码愉快
    • 如果您能帮助跟进link,那就太好了
    【解决方案2】:

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

    【讨论】:

    • @user11638654 这是假设 caller 是根据提供的数据框的列,我使用原始 df 没有设置索引和删除等。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']]})
    【解决方案3】:

    您可以在df9中查找值:

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

    【讨论】:

    • 这工作到目前为止,但我怎样才能使 df8.contents 成为字符串列表(如问题)
    • 查看@WeNYoBen 的回答 :)
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2019-11-04
      • 2019-08-16
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多