为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas 如何避免在 groupby nlargest n 中申请

Pandas 如何避免在 groupby nlargest n 中申请

拉丁的传说 2022-01-05 13:11:27
Pandas apply 一般建议不要使用。我在这里有一种情况,如果有更有效的替代申请选项,我很感兴趣。import numpy as npimport pandas as pddf = 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()有什么替代方法吗?无论是更长的代码行还是其他任何东西!
查看完整描述

2 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

sort_values 做的 tail


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


查看完整回答
反对 回复 2022-01-05
?
达令说

TA贡献1821条经验 获得超6个赞

当我们有 NaN 时


import numpy as np

import pandas as pd


df = 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  value

0     a  1990   10.0

1     b  1990   11.0

2     c  1990   12.0

3     d  1992   20.0

4     e  1992   21.0

5     f  1992   22.0

6     g  1992   23.0

7     h  1993   30.0

8     i  1993   31.0

9     j  1993   32.0

10    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  value

2    c  1990   12.0

1    b  1990   11.0

6    g  1992   23.0

5    f  1992   22.0

9    j  1993   32.0

8    i  1993   31.0

不使用应用(更快)

print(df.dropna(subset=['value']).sort_values('value').groupby('year').tail(2))

# time: 2.01ms


  item  year  value

1    b  1990   11.0

2    c  1990   12.0

5    f  1992   22.0

6    g  1992   23.0

8    i  1993   31.0

9    j  1993   32.0


查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号