找到仅有一个分类值不同的重复行

时间:2017-09-30 13:55:06

标签: python pandas dataframe

我的数据框如下:

import pandas as pd
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',\
                          'foo', 'bar', 'foo', 'foo'],'C' :[1,1,2,2,3,4,5,6],'D',[11,11,12,12,13,14,15,16]})

我想过滤这个数据框,只保留A等于'foo'的行,并且没有重复的行,唯一的区别是A是'bar':

在这种情况下:

df2=    A  C  D
   4  foo  3  13 
   6  foo  5  15
   7  foo  6  16

如果可以使用“A”的其他分类值进行推广,那么会更好,可以选择删除这些“A”值的哪些元组示例:

import pandas as pd
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'baz',\
                          'foo', 'baz', 'foo', 'foo'],'C' :[1,1,2,2,3,4,5,6]})

当要删除的元组是('foor','bar')时应该保留第2,4,6,7行

2 个答案:

答案 0 :(得分:1)

使用transform将检查值转换为set s,然后转换为boolean indexing

df = df[df.groupby('C')['A'].transform(lambda x: set(x) == set(['foo']))]
print (df)
     A  C
4  foo  3
6  foo  5
7  foo  6

编辑:

df = df[df.groupby(['C', 'D'])['A'].transform(lambda x: set(x) == set(['foo']))]
print (df)
     A  C   D
4  foo  3  13
6  foo  5  15
7  foo  6  16

<强>详细

print (df.groupby(['C', 'D'])['A'].transform(lambda x: set(x) == set(['foo'])))
0    False
1    False
2    False
3    False
4     True
5    False
6     True
7     True
Name: A, dtype: bool

<强>计时

np.random.seed(123)
N = 10000

df = pd.DataFrame({'A': np.random.choice(['foo','bar','baz'], N),
                   'C': np.random.randint(1000,size=N),
                   'D': np.random.randint(1000,size=N)})
#print (df)

In [149]: %timeit (df[df.groupby(['C', 'D'])['A'].transform(lambda x: set(x) == set(['foo']))])
1 loop, best of 3: 2.54 s per loop

In [150]: %timeit (df.groupby(['C', 'D']).filter(lambda x: (x['A'] == 'foo').all()))
1 loop, best of 3: 6.21 s per loop

答案 1 :(得分:1)

使用filter

In [5331]: df.groupby(['C', 'D']).filter(lambda x: (x['A'] == 'foo').all())
Out[5331]:
     A  C   D
4  foo  3  13
6  foo  5  15
7  foo  6  16