首页 > 解决方案 > 熊猫如何避免在 groupby nlargest n 中应用

问题描述

Pandas apply 一般不建议使用。如果有更有效的选择来替代应用选项,我有一种情况我很感兴趣。

import numpy as np
import pandas as pd

df = pd.DataFrame({'year': [1990,1990,1990,1992,1992,1992,1992,1993,1993,1993],
                   'item': list('abcdefghij'),
                  'value': [100,200,300,400,500,600,700,800,900,990]})
df

我想获得每年的前 2 个值。

df.groupby('year')['value'].apply(lambda x: x.nlargest(2)).reset_index()

有没有其他选择?无论是更长的代码行还是其他任何东西!

标签: pythonpandas

解决方案


sort_valuestail

df.sort_values('value').groupby('year').tail(2) # when need continue position 
Out[199]: 
   year item  value
1  1990    b    200
2  1990    c    300
5  1992    f    600
6  1992    g    700
8  1993    i    900
9  1993    j    990

或者

df.sort_values('value').groupby('year',as_index=False).nth([-2,-1])#more flexible you can pick 1,-1 
Out[202]: 
   year item  value
1  1990    b    200
2  1990    c    300
5  1992    f    600
6  1992    g    700
8  1993    i    900
9  1993    j    990

定时

%timeit df.sort_values('value').groupby('year').tail(2)
1000 loops, best of 3: 894 µs per loop
%timeit df.groupby('year')['value'].apply(lambda x: x.nlargest(2)).reset_index()
100 loops, best of 3: 2.76 ms per loop

推荐阅读