2016-07-14 7 views
3

groupby 객체의 n 번째 행, 즉 마지막 행을 제거하려고합니다. groupby.nthgroupby에서 n 번째 행 제거

n 번째 행을 제거하거나 n 번째 행을 제외한 모든 행을 가져 오는 비슷한 방법이 있습니까?

+0

당신이 몇 가지 코드를 게시 할 수 있습니까? –

답변

3

당신은 모든 nth 행의 인덱스를 찾은 다음 선택할 수 있습니다 Index.differenceix의 : 마지막없이 모든 행을해야 할 경우

import pandas as pd 

df = pd.DataFrame({'A':[1,1,1,2,2,2], 
        'B':[4,5,6,7,8,9]}) 

print (df) 
    A B 
0 1 4 
1 1 5 
2 1 6 
3 2 7 
4 2 8 
5 2 9 

print (df.ix[df.index.difference(df.groupby('A', as_index=False)['B'].nth(1).index)]) 
    A B 
0 1 4 
2 1 6 
3 2 7 
5 2 9 
idx = df.groupby('A', as_index=False)['B'].nth(1).index 
print (idx) 
Int64Index([1, 4], dtype='int64') 

print (df.index.difference(idx)) 
Int64Index([0, 2, 3, 5], dtype='int64') 

print (df.ix[df.index.difference(idx)]) 
    A B 
0 1 4 
2 1 6 
3 2 7 
5 2 9 

사용 GroupBy.tail :

print (df.ix[df.index.difference(df.groupby('A')['B'].tail(1).index)]) 

    A B 
0 1 4 
1 1 5 
3 2 7 
4 2 8 

타이밍 :

In [27]: %timeit (df.groupby('A').apply(lambda x: x.iloc[:-1, :]).reset_index(0, drop=True).sort_index()) 
100 loops, best of 3: 2.48 ms per loop 

In [28]: %timeit (df.ix[df.index.difference(df.groupby('A')['B'].tail(1).index)]) 
1000 loops, best of 3: 1.29 ms per loop 

In [29]: %timeit (df.ix[df.index.difference(df.groupby('A', as_index=False)['B'].nth(1).index)]) 
The slowest run took 4.42 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 1.48 ms per loop 
0

귀하의 데이터 프레임은 df입니다.

df.groupby(something_to_group_by).apply(lambda x: x.iloc[:-1, :]).reset_index(0, drop=True).sort_index()