合并pandas df与how =内部和非唯一项目

时间:2018-06-30 22:45:32

标签: python pandas

我有两个看起来像这样的数据框:

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中更多的项。

1 个答案:

答案 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

之所以可行,是因为df1df2现在有第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