【问题标题】:'merge' 2 dataframes on elements from list? - double key在列表中的元素上“合并”2个数据框? - 双键
【发布时间】:2019-11-04 16:27:22
【问题描述】:

这是'merge' 2 dataframes on elements from list?的后续问题 扩展名是,现在某些名称可以在 df8 中翻倍,因此为了能够区分各个文本,我创建了一个日期。

df8=pd.DataFrame({'Dates':['2017-12-14', '2017-12-14','2017-12-16'],'names':[['Hans','Meier'],['Debby','Harry'],['Hans','Harry']]})
df9=pd.DataFrame({'Date':['2017-12-14','2017-12-14','2017-12-14','2017-12-14','2017-12-14','2017-12-16','2017-12-16'],'caller':['Hans','Meier','Debby','Harry','Peter','Hans','Harry'],'text':[['hi im hans'],['hi im meier'],['hi im debby'],['hi im harry'],['hi im peter'],['my name is hans'],['my name is harry']]})
df9.set_index(df9.Date, inplace = True)
df9.drop('Date', axis = 1, inplace = True)
df9.head(10)


Date        names    text
2017-12-14  Hans    [hi im hans]
2017-12-14  Meier   [hi im meier]
2017-12-14  Debby   [hi im debby]
2017-12-14  Harry   [hi im harry]
2017-12-14  Peter   [hi im peter]
2017-12-16  Hans    [my name is hans]
2017-12-16  Harry   [my name is harry]

结果应该是,如果该人在相应的列表中,则 df9 中的人所说的文本出现在 df8 中,另外名称和日期现在必须匹配

所以输出是

Date          names                  content
2017-12-14 ['Hans','Meier']          ['hi im hans', 'hi im meier']
2017-12-14 ['Debby','Harry',]        ['hi im debby', 'hi im harry',]
2017-12-16 ['Hans', 'Harry']         ['my name is hans','my name is harry']

应用上一个问题的结果

df9['text']=df9['text'].str[0]
l=[df9.loc[x,'text'].tolist() for x in df8.names]
df8['cont']=l

产生这个错误

“[['Hans', 'Meier']] 中没有一个在 [index] 中”

这显然与日期索引有关,但我不知道如何解决。 我玩了一点loc[],但错误仍然存​​在

【问题讨论】:

    标签: python string pandas list


    【解决方案1】:

    IIUC,你可以这样做:

    展平df8并分配给m

    m=pd.DataFrame({'Dates':df8.loc[df8.index.repeat(df8.names.str.len()),'Dates'],
             'names':np.concatenate(df8.names)})
    

    那么,mergegroupby

    (m.merge(df9,left_on=['Dates','names'],right_on=['Date','caller']).
    groupby('Dates')['text'].apply(sum).reset_index())
    

            Dates                                 text
    0  2017-12-14            [hi im hans, hi im meier]
    1  2017-12-15           [hi im debby, hi im harry]
    2  2017-12-16  [my name is hans, my name is harry]
    

    【讨论】:

    • 这行得通 :) 但它表明我忘记了示例中的重要一点:日期不是排他性的,请查看更新后的问题
    • 在更新后的示例中,它将 2017-12-14 上的所有内容拉到一个列表中,但我需要它们保持分隔 0 ['Hans','Meier'] 1['Debby', 'Harry'] 及其各自的文本
    • 好的,我解决了...只是使用了另一个唯一键而不是日期...我要谢谢你!
    • @user11638654 好的。我当时不在线。感谢您的支持
    猜你喜欢
    • 2019-11-03
    • 2019-08-16
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多