遍历两个熊猫数据帧,并从df1中找到一个字符串,其中a在df2中

时间:2019-03-26 20:08:49

标签: python string pandas dataframe

我有两个Dataframe,我们称它们为df1和df2。

df1

Term Served term1 82321 term2 54232 term3 34323 term4 1231

df2

Full Term clicks this is term1 233 oh boy this is term2 122 yea that's right term1 1121 oh no not that term4 313123

我想逐行查找df1中的字词每次出现在df2中。之后,我想总结该特定字词的所有点击。输出看起来像

Term Served Clicks term1 82321 1354 term2 54232 122 term3 34323 0 term4 1231 313123

这是我到目前为止所拥有的。我一直没有抓住df1中的术语出现在df2中的所有时间。下面的代码仅使循环遍历df1中的第一行。也许我不了解str.findall(),或者我的循环有误。

for index, row in df1.iterrows(): for row2 in df2.iteritems(): full_headline = df2['Full Term'].str.findall(row[0]) print(full_headline)

1 个答案:

答案 0 :(得分:2)

IIUC使用str.findall从df1扩展df2中的项,那么我们需要gourpby sum df2中的公共项。到目前为止,我们只需要将结果分配给df1使用map

df2['Full Term']=df2['Full Term'].str.findall('|'.join(df1.Term)).str[0]
s=df2.groupby('Full Term').clicks.sum()
df1['Clicks']=df1.Term.map(s).fillna(0)
df1
Out[114]: 
    Term  Served    Clicks
0  term1   82321    1354.0
1  term2   54232     122.0
2  term3   34323       0.0
3  term4    1231  313123.0

如果是这种情况,请更新str.findall之后的unnesting

df2['Full Term']=df2['Full Term'].str.findall('|'.join(df1.Term))
df2=df2[df2['Full Term'].astype(bool)].copy()#adding here

def unnesting(df, explode):
    idx=df.index.repeat(df[explode[0]].str.len())
    df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
    df1.index=idx
    return df1.join(df.drop(explode,1),how='left')
s=unnesting(df2,['Full Term']).groupby('Full Term').clicks.sum()
df1['Clicks'] = df1.Term.map(s).fillna(0)
df1
Out[137]: 
    Term  Served  Clicks
0  term1   82321    1354
1  term2   54232     355
2  term3   34323     233
3  term4    1231  313123