比较两个Python Pandas数据框的2列并获取共同的行

9

I have 2 Dataframe as follows:

DF1=
    A    B   C    D
0   AA   BA  KK   0
1   AD   BD  LL   0
2   AF   BF  MM   0

DF2=
    K    L
0   AA   BA
1   AD   BF
2   AF   BF

最终我想要得到的是:

DF1=
    A    B   C    D
0   AA   BA  KK   1
1   AD   BD  LL   0
2   AF   BF  MM   1

所以,我想比较两个数据框,我想看到第一个数据框(对于列A和B)与第二个数据框(列K和L)共有哪些行,并在第一个数据框的列D上分配1。

我可以使用for循环,但是对于大量条目来说速度会非常慢。

任何线索或建议将不胜感激。

4个回答

17

如果你重命名df2的列,那么比较每一行就会更容易:

In [35]:

df2.columns = ['A', 'B']
df2
Out[35]:
    A   B
0  AA  BA
1  AD  BF
2  AF  BF
In [38]:

df1['D'] = (df1[['A', 'B']] == df2).all(axis=1).astype(int)
df1
Out[38]:
    A   B   C  D
0  AA  BA  KK  1
1  AD  BD  LL  0
2  AF  BF  MM  1

如果您无法重命名它们,可以动态创建一个新的DataFrame,其内容是df2的视图,但列名与df1匹配,然后再次运行此代码即可。 - abarnert
你可以将 rename 的结果分配给另一个 df 并进行比较,如 df3 = df2.rename(columns={'K':'A', 'L':'B'}) - EdChum
或者直接在表达式中使用 df2.rename(…),而无需将其存储在临时名称 df3 中。 - abarnert
当然,我只是指出,即使他不方便自己(而且使用起来也不难),你的答案仍然基本上是正确的答案,希望他能接受这个答案,即使他因某种原因无法更改“df2”的定义。 - abarnert
如果DF1的行数比DF2多或少怎么办? - Mohammad Saifullah
显示剩余2条评论

6
df1['ColumnName'].isin(df2['ColumnName']).value_counts()

2
这是我的解决方法:
df1 = pd.DataFrame({"A":['AA','AD','AD'], "B":['BA','BD','BF']})
df2 = pd.DataFrame({"A":['AA','AD'], 'B':['BA','BF']})
df1['compressed']=df1.apply(lambda x:'%s%s' % (x['A'],x['B']),axis=1)
df2['compressed']=df2.apply(lambda x:'%s%s' % (x['A'],x['B']),axis=1)
df1['Success'] = df1['compressed'].isin(df2['compressed']).astype(int)
print df1

    A   B     compressed   Success
0  AA  BA      AABA          1
1  AD  BD      ADBD          0
2  AD  BF      ADBF          1

3
您的问题是关于您的回答与原问题如何相关的。 - EdChum
1
我已经尝试了不同的数据框,它达到了预期的目的。 - Mohammad Saifullah
2
但是您所期望的输出并不符合原始问题的要求,您应该更新您的问题或发布一个新的问题。 - EdChum
这是一个令人困惑的回复,没有解释正在发生什么或为什么会这样。此外,此页面上至少还有一个更好的答案。 - FistOfFury

2
DF1.merge(right=DF2, left_on=[DF1.A, DF1.B], right_on=[DF2.K, DF2.L], indicator=True, how='left')

提供:

A   B   C  D    K    L     _merge
0  AA  BA  KK  0   AA   BA       both
1  AD  BD  LL  0  NaN  NaN  left_only
2  AF  BF  MM  0   AF   BF       both

因此,如上所述,指标可以完成这项工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接