2017-09-24 4 views
0

私はパンダのグループ化に苦労しています。例: このデータセットでグループのパンダの基準

name number 
A 10 
A 8 

B 7 
B 6 
B 9 

、Iカテゴリのすべてのラインアイテムを除外することが可能な最も簡単なベクトル化方法、「番号」の最小値は、全て上記で8 未満である(列)「名前」ものですBは8より小さい値を持つ最小要素があるので、削除されます。groupby,applyまたはfilterと可能でなければならないと思いますが、どうすればよいかと思います。

答えて

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

あなたは、フィルタのマスクのminboolean indexingtransformを使用することができます。

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には 'apply''''''''''''' filter''が適用されているため、適用ベースの解決法が追加されました。重い作業で終わったことを示すかもしれない。 :) :)あなたからの先生と素晴らしい解決策は、時にはコメントTBHにとどまります。 – Dark

関連する問題