【问题标题】:How to quickly identify duplicate rows in a python dataframe where columns may be flipped如何快速识别python数据框中可能翻转列的重复行
【发布时间】:2022-01-23 05:52:39
【问题描述】:

我有一个三列的表,其中两列可以翻转:

row A    B    Time
001 C1   DQ   300
002 C1   EG   355
003 DQ   C1   300
004 DQ   EG   400
005 IX   Q2   410
006 Q2   IX   410

我想首先识别重复的行,然后随机保留 1 个重复的条目。

对于第一个测试,显然第 001 / 003 行是一对,005 / 006 也是。但是,为了避免偏差,我希望有 50% 的概率保留第 001 行或第 003 行,并且在第二次配对。

我的直觉是逐行循环并创建一个AB行,如下所示,按时间和随机变量排序,然后选择AB lAB。很明显,看看下面的行,我最终会得到 4 个独特的组合,随机保留适当的 A 或 B 条目。

row AB      lAB     Time  rand_val
001 C1DQ    null    300   0.00031
003 C1DQ    C1DQ    300   0.37647
002 C1EQ    C1DQ    355   0.78345
004 DQEG    C1EQ    400   0.63145
006 IXQ2    DQEG    410   0.21364
005 IXQ2    IXQ2    410   0.91462

不幸的是,我有一个很长的数据集,并且在循环创建 AB 时提取 A 和 B 的值意味着多次传递和排序。有没有更优化的“熊猫”方法来解决这个问题?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    从列 AB 创建排序的元组,然后使用此键对行进行分组,最后随机保留一个:

    groups = df[['A', 'B']].apply(lambda x: tuple(sorted(x)), axis=1)
    out = df.groupby(groups).sample(n=1)
    print(out)
    
    # Output:
       row   A   B  Time
    2  003  DQ  C1   300
    1  002  C1  EG   355
    3  004  DQ  EG   400
    5  006  Q2  IX   410
    

    关于groups

    >>> pd.concat([df[['A', 'B']], groups.rename('AB')], axis=1)
    
        A   B        AB
    0  C1  DQ  (C1, DQ)
    1  C1  EG  (C1, EG)
    2  DQ  C1  (C1, DQ)  # swap here
    3  DQ  EG  (DQ, EG)
    4  IX  Q2  (IX, Q2)
    5  Q2  IX  (IX, Q2)  # swap here
    

    注意@mozway建议用frozenset代替tuple(sorted(...)),所以替换:

    groups = df[['A', 'B']].apply(lambda x: tuple(sorted(x)), axis=1)
    

    作者:

    groups = df[['A', 'B']].apply(frozenset, axis=1)
    

    【讨论】:

    • 即将提供相同的答案 ;) 不过我会使用 frozenset
    • @mozway。杰出的!!!我可以用你的想法更新我的解决方案吗?
    • 您想在groupby 中添加时间吗?喜欢df.groupby(['time', groups]).sample(n=1)
    • 是的..但是现在我已经阅读了有关 frozenset 的内容,我认为这要简单得多,我可以简单地保留这些列?
    • 我认为可能是的。我更喜欢让groupby 管理其他列:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2013-09-15
    • 2019-11-08
    • 2019-01-28
    • 2019-02-04
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多