我有以下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
,{首先{1}}组,然后进行year_month
;
答案 0 :(得分: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