2016-07-14 16 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() 
関連する問題