【问题标题】:Pandas merging two dataframes by removing only one row for every duplicate row between dataframesPandas 通过为数据帧之间的每个重复行仅删除一行来合并两个数据帧
【发布时间】:2021-01-24 19:45:06
【问题描述】:

我有两个数据框,我正在合并它。合并时应删除重复项。但是对于第 1 帧中的一个重复行,它应该只删除第 2 帧中的一个重复行,即使有两个这样的行,如下所示 df1:

colA colB colC
  1    2    3
  1    1    2
  1    5    4

df2:

colA colB colC
 1    2    3
 1    2    3
 1    1    2

结果:

colA colB colC
 1    2    3
 1    5    4

这里从两个数据帧中删除了 1 组 1 2 3 (但保留了另一个 1 2 3 数据集)。 1 1 2 集已从两个数据帧中删除。由于在 df2 中未找到匹配项,因此已保留 1 5 4 组。

有没有办法在 pandas 中实现这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是一种方式:

    import pandas as pd
    
    df1 = pd.DataFrame({'colA': [1, 1, 1],
                        'colB': [2, 1, 5],
                        'colC': [3, 2, 4]})
    
    df2 = pd.DataFrame({'colA': [1, 1, 1],
                        'colB': [2, 2, 1],
                        'colC': [3, 3, 2]})
    
    df1 = df1.groupby(['colA', 'colB', 'colC']).size().reset_index(name='count1')
    df2 = df2.groupby(['colA', 'colB', 'colC']).size().reset_index(name='count2')
    
    df_merged = pd.concat((df1, df2)).fillna(0)
    
    df_final = df_merged.groupby(['colA', 'colB', 'colC'])\
        .apply(lambda x: x['count2'].sum() - x['count1'].sum())\
        .loc[lambda p: p != 0]\
        .reset_index()\
        .drop(0, axis=1)
    
    print(df_final)
    

    输出:

       colA  colB  colC
    0     1     2     3
    1     1     5     4
    

    【讨论】:

      【解决方案2】:

      最后我通过以下方法得到了答案。大卫的回答也很有魅力

      result1 = result.groupby(['colA','colB','colC'], as_index=False).size()
      result1 = result1[result1['size'] % 2 != 0]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        • 2020-02-29
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多