这是对这个'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产生此错误
“[‘汉斯’,‘梅尔’都不在索引里”
这与日期索引有关,但我不知道如何解决。我和loc[]玩了一会儿,但是错误仍然存在。
发布于 2019-06-22 14:47:02
IIUC,你可以这样做:
扁平df8并将其分配给m
m=pd.DataFrame({'Dates':df8.loc[df8.index.repeat(df8.names.str.len()),'Dates'],
'names':np.concatenate(df8.names)})然后,merge和groupby
(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]https://stackoverflow.com/questions/56709889
复制相似问题