2017-09-24 115 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