我的数据框如下:
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行
答案 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