首页 > 解决方案 > 基于两列识别两个 Pandas DataFrames 之间共享的行

问题描述

相关:如何在 2 个数据框之间的 2 列中找到具有相同值但在其他列中具有不同值的行 pandas

我有两个 DataFrame:df1df2.

我想在'columnA'(object)和'columnB'(int)中找到这些组合DataFrame中具有相同值的所有行。这些行在我不关心的其他列中将具有不同的值。这些 DataFrame 的形状也不同。

我试过类似的东西:

concat = pd.concat([df1, df2])
overlap = concat[concat.duplicated(subset=['columnA','columnB'], keep=False)]

但是输出看起来不正确(也许是)。只是想检查一下-我错过了什么吗?

编辑:

假设我想要所有具有相同值columnA但不同值的行columnB- 这可行吗?

df3 = (concat[concat.duplicated(subset=['columnA'], keep=False)]
           .drop_duplicates(subset=['columnB']))

标签: pythonpandas

解决方案


您可以使用pd.merge

df1 = pd.DataFrame(data=[('A','B','C'),('E','F','G'),('A','B','F')], columns=['columnA','columnB','columnC'])
df2 = pd.DataFrame(data=[('X','Y','G'),('A','B','Y'),('A','C','F')], columns=['columnA','columnB','columnC'])

df2['columnB'] = df2['columnB'].astype(str) #convert to string

print(df1)
  columnA columnB columnC
0       A       B       C
1       E       F       G
2       A       B       F

print(df2)
 columnA columnB columnC
0       X       Y       G
1       A       B       Y
2       A       C       F

然后申请后pd.merge

df_m = pd.merge(df1,df2,how='inner',on='columnA')

----
df_m
  columnA columnB_x columnC_x columnB_y columnC_y
0       A         B         C         B         Y
1       A         B         C         C         F
2       A         B         F         B         Y
3       A         B         F         C         F

关于您的编辑,试试这个:

df_final = df_m[df_m['columnB_x'] != df_m['columnB_y']]

------
print(df_final)
  columnA columnB_x columnC_x columnB_y columnC_y
1       A         B         C         C         F
3       A         B         F         C         F

推荐阅读