【问题标题】:Efficient way in Pandas for removing columns with duplicate values in different columnsPandas 中删除不同列中具有重复值的列的有效方法
【发布时间】:2019-08-24 02:49:38
【问题描述】:

我正在 Pandas 中寻找一种高效且优雅的方式来删除 DataFrame 中具有完全相同的值集但在不同列中的“重复”行。

理想情况下,我正在寻找一种矢量化方法来执行此操作,因为我已经可以使用 Pandas pandas.DataFrame.iterrows() 方法识别非常低效的方法。

假设我的 DataFrame 是:

source|target|
----------------
| 1   |  2   |
| 2   |  1   |
| 4   |  3   |
| 2   |  7   |
| 3   |  4   |

我希望它变成:

source|target|
----------------
| 1   |  2   |
| 4   |  3   |
| 2   |  7   |

【问题讨论】:

  • 这是重复的,很多问题都在问这个问题。看看stackoverflow.com/questions/51603520/…
  • 这确实是重复的。 RafaelC 提供的链接就是您的答案。您的解决方案在这里:pd.DataFrame(np.sort(df.values, axis=1), columns=df.columns).drop_duplicates()
  • 非常感谢,抱歉没有发现这个

标签: python python-3.x pandas


【解决方案1】:
df = df[~pd.DataFrame(np.sort(df.values,axis=1)).duplicated()]

    source  target
0   1   2
2   4   3
3   2   7

解释

np.sort(df.values,axis=1) 正在按列对 DataFrame 进行排序

array([[1, 2],
       [1, 2],
       [3, 4],
       [2, 7],
       [3, 4]], dtype=int64)

然后从中创建一个数据框并在duplicated上使用前缀~检查non duplicated

~pd.DataFrame(np.sort(df.values,axis=1)).duplicated()

0     True
1    False
2     True
3     True
4    False
dtype: bool

并将其用作mask 获得最终输出

    source  target
0   1   2
2   4   3
3   2   7

【讨论】:

  • 嗨 Akhilesh,虽然这可能是正确的答案,但您应该对您在此处所做的事情留下一些见解/解释,以使其成为一个高质量的答案,这将有助于其他人了解问题的根本原因.
  • @nircraft 感谢您指出这一点。请检查更新
猜你喜欢
  • 2022-01-11
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多