我有两个看起来像这样的数据框:
df1
a b c
0 foo None qux
1 foo bar None
2 foo None None
3 foo None qux
4 foo None None
df2
a b c
0 foo None qux
1 foo None qux
2 foo bar qux
3 foo bar None
4 foo bar None
我以为是那样
pd.merge(df1, df2, on=df1.columns.tolist(), how='inner')
会返回
a b c
0 foo None qux
1 foo None qux
2 foo bar None
而是得到了这个:
a b c
0 foo None qux
1 foo None qux
2 foo None qux
3 foo None qux
4 foo bar None
5 foo bar None
我可以合并 df1和df2以仅找到两者的交集吗?怎么样?我不明白内部联接如何返回比单个df中更多的项。
答案 0 :(得分:1)
合并不知道如何区分那些相同的行,因此重复行的次数超出了必要。
我建议使用一个临时列来记录cumcount
,执行merge
-ing,然后再删除temp列。
df1['d'] = df1.groupby(df1.columns.tolist()).cumcount()
df2['d'] = df2.groupby(df2.columns.tolist()).cumcount()
df1.merge(df2, how='inner').drop('d', 1)
a b c
0 foo None qux
1 foo bar None
2 foo None qux
之所以可行,是因为df1
和df2
现在有第4个指示符列来区分重复项:
print(df1)
a b c d
0 foo None qux 0
1 foo bar None 0
2 foo None None 0
3 foo None qux 1
4 foo None None 1
print(df2)
a b c d
0 foo None qux 0
1 foo None qux 1
2 foo bar qux 0
3 foo bar None 0
4 foo bar None 1