python - pandas groupby 多列默认情况下不对值进行排序
问题描述
我有以下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
按降序排序,但似乎不是,所以我想知道如何pct
在每个year_month
, code
group 中排序,然后执行cumsum
;
解决方案
您的代码不同,对于相同的输出需要按前 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
推荐阅读
- elasticsearch - 如何禁用弹性搜索的前缀匹配?
- python - 为什么这些看起来一样的字符串,却被代码区别对待?
- msal - 如何修复 msal.js 中 UserAgentApplication 的“TypeError:this.isCallback 不是函数”错误
- javascript - 如何在 .js 文件中创建函数并将其添加到另一个 .js 文件?
- arrays - 将 Array{Array{Float64},1} 转换为 Array{Float64,2} 的最佳方法,反之亦然
- java - 如何使用注释修复休眠?
- excel - 如何用两张表构建 Excel 并下载?
- python - obj 文件作为 Scene 对象而不是 Trimesh 对象加载
- celery - Django celery 不能同时运行多个时钟任务。有没有其他的出路?
- c# - 有什么办法可以加快使用 Google Play 游戏打开存档的速度吗?