groupby多列没有按defau对值进行排序

2024-04-19 15:38:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的df

code      pct         year_month
10        6.6156      201905
10        6.0868      201905
10        5.8975      201905
10        11.2195     201905
10        11.1404     201905 

我喜欢做以下事情

df2 = df.sort_values('pct', ascending=False)
df2['pct'].cumsum().le(20).mean()
0.2

groupby的方式

df.groupby(['year_month', 'code'])['pct'].apply(lambda x: x.cumsum().le(20).mean())

但结果不同

year_month  code
201905      BR10    0.6

我认为groupby应该按照默认的降序对pct进行排序,但似乎不是,所以我想知道如何在每个year_monthcode组中对cumsum进行排序


Tags: ledf排序codemeansort事情year
1条回答
网友
1楼 · 发布于 2024-04-19 15:38:18

您的代码是不同的,对于相同的输出,需要按前2列排序-['year_month','code'],或者使用此示例数据忽略它(如果已经排序):

print (df['pct'].cumsum().le(20).mean())
0.6

df2 = df.sort_values(['year_month','code'], ascending=False)
print (df2['pct'].cumsum().le(20).mean())
0.6

groupby中的排序值在groupby-这里是['year_month', 'code'],而不是pct

df = df.groupby(['year_month', 'code'])['pct'].apply(lambda x: x.cumsum().le(20).mean())
print (df)
year_month  code
201905      10      0.6
Name: pct, dtype: float64

因此,对于相同的输出排序,这里添加了pct列,如果需要防止按'year_month', 'code']排序,则添加sort=False

df2 = df.sort_values('pct', ascending=False)
print (df2['pct'].cumsum().le(20).mean())
0.2

df = (df.sort_values(['pct'], ascending=False)
        .groupby(['year_month', 'code'], sort=False)['pct']
        .apply(lambda x: x.cumsum().le(20).mean()))
print (df)
year_month  code
201905      10      0.2
Name: pct, dtype: float64

相关问题 更多 >