2017-09-24 7 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가 없다 '적용''transform''filter' na 그래서 적용된 솔루션을 추가했습니다 :). 무거운 노동으로 일을 보여줄 수도 있습니다. :) :) 선생님과 훌륭한 솔루션을 때로는 의견 TBH에 머물러 있습니다. – Dark