【问题标题】:How to compare values of certain columns of one dataframe with the values of same set of columns in another dataframe?如何将一个数据帧中某些列的值与另一个数据帧中同一组列的值进行比较?
【发布时间】:2020-07-04 11:38:48
【问题描述】:

我有df1、df2、df3三个dataframe,定义如下

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 作为df4 = df1.sample(n=2),它给出了类似

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

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

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

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

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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用两个连续的DataFrame.merge 操作以及在右侧数据帧上使用DataFrame.add_suffixleft 合并数据帧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                    
    

    【讨论】:

      【解决方案2】:

      这是我对整个数据集的处理方式。如果您想先采样,只需更新最后的合并语句,将df1 替换为df4 或仅对t 进行采样

      PK = ["A","B"]
      
      df2 = pd.concat([df2,df2], axis=1)
      df2.columns=['A','B','C','A(df2)', 'B(df2)', 'C(df2)']
      df2.drop(columns=['C'], inplace=True)
      
      df3 = pd.concat([df3,df3], axis=1)
      df3.columns=['A','B','C','A(df3)', 'B(df3)', 'C(df3)']
      df3.drop(columns=['C'], inplace=True)
      
      t = df1.merge(df2, on=PK, how='left')
      t = t.merge(df3, on=PK, how='left')
      

      输出

          A   B   C   A(df2)  B(df2)  C(df2)  A(df3)  B(df3)  C(df3)
      0   1   a   a1  1.0     a       X       NaN     NaN     NaN
      1   2   b   b2  2.0     b       Y       NaN     NaN     NaN
      2   3   c   c3  3.0     c       Z       NaN     NaN     NaN
      3   4   d   d4  NaN     NaN     NaN     4.0     d       P
      4   5   e   e5  NaN     NaN     NaN     5.0     e       Q
      5   6   f   f6  NaN     NaN     NaN     6.0     f       R
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 2016-01-22
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        相关资源
        最近更新 更多