2014-04-12 1 views
1

팬더 그룹의 요소를 그룹 내에서 선택적으로 제거하고 싶습니다. 여기 팬더 그룹의 요소를 선택적으로 필터링하는 방법

이 예제 :
>>> dff = pd.DataFrame({'A': np.arange(8), 'B': list('aabbbbcc'), 'C': list('lmnopqrt')}) 

>>> dff 
    A B C 
0 0 a l 
1 2 a m 
2 4 b n 
3 1 b o 
4 9 b p 
5 2 b q 
6 3 c r 
7 10 c t 

>>> grped = dff.groupby('B') 
>>> grped.groups 
{'a': [0, 1], 'c': [6, 7], 'b': [2, 3, 4, 5]} 

일종의 'A'(COL)에서 그룹 내 그룹 (맞춤 기능/방법을 적용

'A'항목에서 가장 높은 값을 가진 로우를 제외한 모든 요소를 ​​제거, 필터 집단).

>>> yourGenius(grped,'A').reset_index() 

반환 dataframe :

A B C 
0 2 a m 
1 9 b p 
2 10 c t 

어쩌면 람다 함수 또는 .filter()이 할 수있는 컴팩트 한 방법이? 감사

답변

5

당신이 그룹 당 하나 개의 행을 선택하려는 경우, 당신은 groupby/agg 인덱스 값을 반환하고 loc를 사용하여 행을 선택하는 데 사용할 수 있습니다. 예를 들어

, B에 의해 그룹에 다음 가장 높은 A 값을 가진 행 선택 : 당신이 그룹 당 많은 행을 선택하려면

In [171]: dff 
Out[171]: 
    A B C 
0 0 a l 
1 2 a m 
2 4 b n 
3 1 b o 
4 9 b p 
5 2 b q 
6 3 c r 
7 10 c t 

[8 rows x 3 columns] 

In [172]: dff.loc[dff.groupby('B')['A'].idxmax()] 
Out[172]: 
    A B C 
1 2 a m 
4 9 b p 
7 10 c t 

, 당신이 반환하는 기능을 groupby/apply를 사용할 수를 각 그룹 에 대한 하위 데이터 프레임 apply 그러면이 하위 DataFrames를 병합하려고 시도합니다. 예를 들어

은 각 그룹에서 마지막을 제외한 모든 행을 선택합니다 :

In [216]: df = pd.DataFrame(np.arange(15).reshape(5,3), columns=list('ABC'), index=list('vwxyz')); df['A'] %= 2; df 
Out[216]: 
    A B C 
v 0 1 2 
w 1 4 5 
x 0 7 8 
y 1 10 11 
z 0 13 14 


In [217]: df.groupby(['A']).apply(lambda grp: grp.iloc[:-1]).reset_index(drop=True, level=0) 
Out[217]: 
    A B C 
v 0 1 2 
x 0 7 8 
w 1 4 5 

또 다른 방법은 인덱스 일련의 값을 반환 groupby/apply을 사용하는 것입니다. 다시 apply 시리즈를 하나의 시리즈로 결합하려고합니다. 그런 다음 인덱스 값으로 행을 선택 df.loc을 사용할 수

In [218]: df.loc[df.groupby(['A']).apply(lambda grp: pd.Series(grp.index[:-1]))] 
Out[218]: 
    A B C 
v 0 1 2 
x 0 7 8 
w 1 4 5 

나는 groupby/filter 필터 전체 그룹 때문에, groupby/filter 당신이 원하는 일을 할 것입니다 생각하지 않습니다. 각 그룹에서 특정 행을 선택할 수는 없습니다.

+0

@DSM : 죄송합니다. 수정 해줘서 고마워. – unutbu

관련 문제