猿问

Pandas 如何避免在 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()

有什么替代方法吗?无论是更长的代码行还是其他任何东西!


拉丁的传说
浏览 122回答 2
2回答

HUX布斯

sort_values 做的 taildf.sort_values('value').groupby('year').tail(2) # when need continue position Out[199]:    year item  value1  1990    b    2002  1990    c    3005  1992    f    6006  1992    g    7008  1993    i    9009  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  value1  1990    b    2002  1990    c    3005  1992    f    6006  1992    g    7008  1993    i    9009  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

达令说

当我们有 NaN 时import numpy as npimport pandas as pddf = pd.DataFrame({'item': list('abcdefghijk'),                   'year': [1990,1990,1990,1992,1992,1992,1992,1993,1993,1993,1993],                   'value':[10 , 11  ,12  ,20  ,21  ,22  ,23  ,30  ,31  ,32  ,np.nan]})print(df)   item  year  value0     a  1990   10.01     b  1990   11.02     c  1990   12.03     d  1992   20.04     e  1992   21.05     f  1992   22.06     g  1992   23.07     h  1993   30.08     i  1993   31.09     j  1993   32.010    k  1993    NaN使用应用(慢)top2 = df.groupby('year')['value'].apply(lambda x: x.nlargest(2)).reset_index(level=0)print(df.loc[top2.index])# time: 2.96ms  item  year  value2    c  1990   12.01    b  1990   11.06    g  1992   23.05    f  1992   22.09    j  1993   32.08    i  1993   31.0不使用应用(更快)print(df.dropna(subset=['value']).sort_values('value').groupby('year').tail(2))# time: 2.01ms  item  year  value1    b  1990   11.02    c  1990   12.05    f  1992   22.06    g  1992   23.08    i  1993   31.09    j  1993   32.0
随时随地看视频慕课网APP

相关分类

Python
我要回答