Pandas - 多列去重

4

我将尝试在Pandas中高效地删除重复项,其中重复项在两个列之间被反转。例如,在这个数据框中:

import pandas as pd
key = pd.DataFrame({'p1':['a','b','a','a','b','d','c'],'p2':['b','a','c','d','c','a','b'],'value':[1,1,2,3,5,3,5]})
df = pd.DataFrame(key,columns=['p1','p2','value'])
print frame

       p1 p2 value
    0  a  b    1
    1  b  a    1
    2  a  c    2
    3  a  d    3
    4  b  c    5
    5  d  a    3
    6  c  b    5

我想要删除第1、5和6行,只留下如下内容:
      p1 p2 value
    0  a  b    1
    2  a  c    2
    3  a  d    3
    4  b  c    5

感谢您提供有关如何实现此操作的想法。
1个回答

14

重新排列p1和p2的值,使它们按照规范顺序出现:

mask = df['p1'] < df['p2']
df['first'] = df['p1'].where(mask, df['p2'])
df['second'] = df['p2'].where(mask, df['p1'])

产出。
In [149]: df
Out[149]: 
  p1 p2  value first second
0  a  b      1     a      b
1  b  a      1     a      b
2  a  c      2     a      c
3  a  d      3     a      d
4  b  c      5     b      c
5  d  a      3     a      d
6  c  b      5     b      c

然后您可以使用drop_duplicates:

df = df.drop_duplicates(subset=['value', 'first', 'second'])

import pandas as pd
key = pd.DataFrame({'p1':['a','b','a','a','b','d','c'],'p2':['b','a','c','d','c','a','b'],'value':[1,1,2,3,5,3,5]})
df = pd.DataFrame(key,columns=['p1','p2','value'])

mask = df['p1'] < df['p2']
df['first'] = df['p1'].where(mask, df['p2'])
df['second'] = df['p2'].where(mask, df['p1'])
df = df.drop_duplicates(subset=['value', 'first', 'second'])
df = df[['p1', 'p2', 'value']]

产出。
In [151]: df
Out[151]: 
  p1 p2  value
0  a  b      1
2  a  c      2
3  a  d      3
4  b  c      5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接