【问题标题】:Pandas removing mirror pairs from dataframe熊猫从数据框中删除镜像对
【发布时间】:2018-01-31 19:05:06
【问题描述】:

我有一个看起来像这样的数据框

A  B  C  D  E
a  b .1 .3 .9
c  d .2 .4 .5
b  a .1 .3 .9
d  c .2 .4 .5

由于第 3 行和第 4 行与第 1 行和第 2 行相同,我需要将它们删除。最终的数据框将如下所示

A  B  C  D  E
a  b .1 .3 .9
c  d .2 .4 .5

df.drop_duplicates 只删除相似对而不是镜像对。有没有什么简单的方法可以在 pandas 中实现以删除此类镜像副本。谢谢!

编辑: 我刚刚尝试了 drop_duplicates(subset=['C','D','E']) ,它会给出这个数据框的结果。是否有任何其他基于“A”、“B”的解决方案。

【问题讨论】:

  • AB 列是不同的。你如何定义“相同”?
  • @Alex 他将它们视为“镜子”。

标签: python pandas dataframe


【解决方案1】:

np.sort + drop_duplicates

df.loc[pd.DataFrame(np.sort(df[['A','B']],1),index=df.index).drop_duplicates(keep='first').index]
Out[316]: 
   A  B    C    D    E
0  a  b  0.1  0.3  0.9
1  c  d  0.2  0.4  0.5

【讨论】:

  • 哦,是的... np.sort()... 但是我不会使用“最后一个”,因为 3 个重复或更多的值只会删除最后一个。因此 ~ 和 keep='first' (默认)。
  • 不错!但是不要忘记 ~ ,否则你会再次获得 3 或更多的多个值。呵呵
  • @JaswanthKumar yw~ :-) 快乐编码
【解决方案2】:

可能不是最有效的,因为它使用 apply,但这里有一个选项:

import pandas as pd

data ='''\
A  B  C  D  E
a  b .1 .3 .9
c  d .2 .4 .5
b  a .1 .3 .9
d  c .2 .4 .5'''

df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')

mask = df[['A','B']].apply(lambda x: list(set(x)), axis=1).duplicated()

df[~mask]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2020-03-23
    • 1970-01-01
    • 2020-05-28
    • 2018-03-15
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多