【问题标题】:Avoid Duplicates Pandas Merge Between a Dataframe and its Copy避免重复数据框与其副本之间的 Pandas 合并
【发布时间】:2021-09-29 22:22:08
【问题描述】:

我需要在同一数据框的列中找到匹配项,我正在做的是复制数据框并在数据框与其副本之间进行合并,但是当两列相等时,有一种方法可以避免重复并且当之前显示相同的结果时。例如:

df1 = pd.DataFrame()
df1['Id'] = ['001','002','003','004','005','006']
df1['Tel'] = ['123','456','789','123','852','123']

df2 = df1

df3 = pd.merge(df1,df2,on='Tel',how='inner')

结果如下:

    Id_x Tel Id_y
0   001 123 001
1   001 123 004
2   001 123 006
3   004 123 001
4   004 123 004
5   004 123 006
6   006 123 001
7   006 123 004
8   006 123 006
9   002 456 002
10  003 789 003
11  005 852 005

但我想要以下结果:

    Id_x Tel Id_y
0   001 123 004
1   001 123 006
2   004 123 006

如您所见,当 Id_x == Id_y 时我需要忽略结果,但当相同的结果以不同的顺序显示时,我也需要忽略,例如在第一个结果中索引 1 是相同的结果索引 3,索引 2 与索引 6 的结果相同,索引 5 与索引 7 的结果相同。所以在最终结果中,我只想要索引 1、索引 2 和索引 5。

有没有办法做到这一点?

非常感谢!

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    Id_xId_y 创建元组,然后对它们进行排序并删除重复项:

    >>> df3[df3[['Id_x', 'Id_y']].apply(lambda x: sorted(tuple(x)), axis=1) 
                                 .duplicated(keep='last')]
    
      Id_x  Tel Id_y
    1  001  123  004
    2  001  123  006
    5  004  123  006
    

    更新

    如果 ID 不在两列中,您能帮我吗?例如,假设 df2 有一个附加行,Id: 007 和 Tel: 852,这个 Id 与 Id: 005 合并,但是当我在 df3 中应用元组时,Id: 007 被删除

    df3 = pd.merge(df1,df2,on='Tel',how='inner').query('Id_x != Id_y')
    df3 = df3[~df3[['Id_x', 'Id_y']].apply(lambda x: sorted(tuple(x)), axis=1)
                                    .duplicated(keep='first')]
    print(df3)
    
    # Output:
       Id_x  Tel Id_y
    1   001  123  004
    2   001  123  006
    5   004  123  006
    12  005  852  007
    

    设置:

    df1 = pd.DataFrame()
    df1['Id'] = ['001','002','003','004','005','006']
    df1['Tel'] = ['123','456','789','123','852','123']
    
    df2 = df1.copy()
    df2 = df2.append(pd.DataFrame({'Id': ['007'], 'Tel': ['852']}))
    

    【讨论】:

    • 感谢您的回答,我收到此错误:TypeError: unhashable type: 'list'SystemError: <built-in function duplicated_object> returned a result with an error set
    • 第一个错误可能是因为你忘记了tuple(xp)。第二个可能是因为你在duplicated之后忘记了(keep='last')
    • 嗨,我希望你没事。在两列中都没有 Id 的情况下,您能帮我吗?例如,假设 df2 有一个附加行,其 ID:007 和 Tel:852,此 Id 与 Id:005 合并,但是当我在 df3 中应用元组时,Id:007 被删除。谢谢!
    • 我根据您的要求更新了我的答案。请检查我的答案好吗?
    【解决方案2】:

    一种迂回的解决方案,但这应该可以为您提供您正在寻找的答案

    df1 = pd.DataFrame()
    df1['Id'] = ['001','002','003','004','005','006']
    df1['Tel'] = ['123','456','789','123','852','123']
    
    df1 = df1.drop_duplicates()
    df2 = df1
    df3 = pd.merge(df1,df2,on='Tel',how='inner')
    df3 = df3[df3['Id_x'] != df3['Id_y']]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 2017-06-27
      • 2017-03-27
      • 2011-12-27
      • 1970-01-01
      • 2021-12-14
      • 2018-11-01
      • 1970-01-01
      相关资源
      最近更新 更多