2017-09-24 81 views
0

我正在与熊猫群体奋斗,这可能很容易解决。 例如熊猫群体标准

name number 
A 10 
A 8 

B 7 
B 6 
B 9 

在该数据集,什么是最简单的矢量化方法,利用该可以排除类别的所有行项目(列)“名”,其中的“数量”的最小值为8以下。 在上述所有B将被删除,因为最小有一个元素的值低于8.

我相信它必须可能与groupby,applyfilter,但不记得,如何。

回答

2

使用filter

In [3281]: df.groupby('name').filter(lambda x: x['number'].min() >= 8) 
Out[3281]: 
    name number 
0 A  10 
1 A  8 

详细

In [3282]: df 
Out[3282]: 
    name number 
0 A  10 
1 A  8 
2 B  7 
3 B  6 
4 B  9 
+0

非常感谢!我之前尝试过,但是在某个地方犯了一个错误......现在我复制了你的代码并且它可以工作!超快速响应! –

2

您可以使用transformmin的面具和boolean indexing的过滤器:

print (df.groupby('name')['number'].transform('min') >=8) 
0  True 
1  True 
2 False 
3 False 
4 False 
Name: number, dtype: bool 

df = df[df.groupby('name')['number'].transform('min') >=8] 
print (df) 
    name number 
0 A  10 
1 A  8 
+0

很多感谢您的帮助! –

+0

@GigiHofleitner别忘了投票表达你的感激之情。 – Dark

2

这也可以用apply来完成(为了完整起见)。

mask = df.groupby('name')['number'].apply(lambda x : (x>=8).all()) 
# or Thanks @Zero mask = df.groupby('name')['number'].min() >= 8 
df[df['name'].isin(mask[mask].index)] 

输出:

 
    name number 
0 A  10 
1 A  8 
+1

为什么'应用',当你可以'df.groupby('name')['number'] .min()> = 8'? – Zero

+0

没有OP声明'应用''变换''过滤器'所以添加了基于应用的解决方案:)。可以用繁重的工作来展示事情。 :) :)先生和你的美妙的解决方案有时留在评论TBH。 – Dark