【问题标题】:pandas inclusive unique values from two columnspandas 包含来自两列的唯一值
【发布时间】:2019-03-15 12:45:14
【问题描述】:

我找不到任何优雅的方法来从列 A 和列 B 中选择唯一行,但不是联合,也不是按顺序。这是为了保持这两列中唯一值的“包容性”交集。

我的目标是在 AB 列中保留尽可能多的唯一值。这些列是共同考虑的,但我正在寻找它们值的所有独特“组合”......

示例数据框

df1 = pd.DataFrame({"A": [ "A1", "A2", "A2", "A3", "A3", ],
                    "B": [ "B1", "B1", "B2", "B3", "B1", ], },
                   index=[ 0, 1, 2, 3, 4, ])

结果:

    A   B
0  A1  B1
1  A2  B1
2  A2  B2
3  A3  B3
4  A3  B1

这没什么用...

df2 = df1.drop_duplicates( subset=[ "A", "B", ], keep="first", inplace=False, )

结果:

    A   B
0  A1  B1
1  A2  B1
2  A2  B2
3  A3  B3
4  A3  B1

下面的代码留下了重复的B1,稍后可以在B 列上使用drop_duplicates 将其删除,但随后A2 也将被删除,如果它与@987654333 存在于一行中,则可以保留它@,因为它在原始数据帧的 index=2 处。

df3 = df1.drop_duplicates( subset=[ "A", ], keep="first", inplace=False, )

结果:

    A   B
0  A1  B1
1  A2  B1
3  A3  B3

如上所述,A2 已被删除,但如果它与 B2 出现在一行中,则可以选择保留它,就像它在原始数据帧的 index=2 中一样。

df4 = df3.drop_duplicates( subset=[ "B", ], keep="first", inplace=False, )

    A   B
0  A1  B1
3  A3  B3

期望的结果:

    A   B
0  A1  B1
1  A2  B2
2  A3  B3

所以我的目标是在AB 列中保留尽可能多的唯一值。这些列是共同考虑的,但我正在寻找它们值的所有独特“组合”......

【问题讨论】:

  • 如果您在原始 DataFrame ['A3', 'B4'] 中再添加一行会发生什么。该行是否也应该出现在您的输出中?现在,我不知道您是在尝试获取具有完全唯一值的最大行数,还是获取捕获所有唯一值的最小行数。
  • 我不介意行 ['A3', 'B4'] 是否恰好出现在输出中,因为我可以在下一步中通过删除 A 列中的重复项将其过滤掉。我所追求的是从A 列中获取所有 值,但只获取一次(因此该列仅包含唯一值),但与B 列中的唯一值配对。
  • 现在,如果我使用subset=[ "A", "B"],那么输出包含两者中唯一的行。如果我先从A 列中删除重复项,然后从B 列中删除重复项,则会丢失许多唯一值。我需要从A 列中删除重复项,但要尽可能多地在B 列中保存值,反之亦然...
  • 可能使用networkx.algorithms.matching.max_weight_matching ?
  • @Alex,你需要这两个列的唯一值,对吧?那你怎么觉得下面的代码不适合呢?

标签: python pandas filter unique drop-duplicates


【解决方案1】:

试试下面的代码:

df1.drop_duplicates( subset=[ "A" and "B"], keep="first", inplace=False, )

输出:

    A   B
0   A1  B1
2   A2  B2
3   A3  B3

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 2014-11-30
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2019-06-05
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多