首页 > 解决方案 > 如何将一个数据帧中某些列的值与另一个数据帧中同一组列的值进行比较?

问题描述

我有三个数据框df1、df2和df3,定义如下

df1 = 
   A  B   C
0  1  a  a1
1  2  b  b2
2  3  c  c3
3  4  d  d4
4  5  e  e5
5  6  f  f6

df2 = 
   A  B  C
0  1  a  X
1  2  b  Y
2  3  c  Z

df3 =
   A  B  C
3  4  d  P
4  5  e  Q
5  6  f  R

我已经定义了一个主键列表PK = ["A","B"]

现在,我采用第四个数据帧 df4 as df4 = df1.sample(n=2),它给出了类似

df4 = 
   A  B   C
4  5  e  e5
1  2  b  b2

现在,我想从 df2 和 df1 中选择与 df4 的主键值匹配的行。例如,在这种情况下,我需要从 df3 获取 index = 4 的行,从 df2 获取 index = 1 的行。

如果可能的话,我需要如下获取数据框:

df =
   A  B   C  A(df2)  B(df2) C(df2)  A(df3)  B(df3)  C(df3)
4  5  e  e5                         5       e       Q
1  2  b  b2  2       b      Y

关于如何解决这个问题的任何想法都会非常有帮助。

标签: pythonpandasdataframe

解决方案


使用两个连续的DataFrame.merge操作以及DataFrame.add_suffix在正确left的数据帧上使用来合并数据帧df4, df2, df3,最后使用字符串Series.fillna替换缺失值:empty

df = (
    df4.merge(df2.add_suffix('(df2)'), left_on=['A', 'B'], right_on=['A(df2)', 'B(df2)'], how='left')
    .merge(df3.add_suffix('(df3)'), left_on=['A', 'B'], right_on=['A(df3)', 'B(df3)'], how='left')
    .fillna('')
)

结果:

# print(df)

   A  B   C A(df2)  B(df2) C(df2) A(df3) B(df3) C(df3)
0  5  e  e5                           5      e      Q
1  2  b  b2      2      b      Y                    

推荐阅读