Skip to main content
 首页 » 编程设计

python之累积总和在组内降序排列。 Pandas

2025年05月04日17JustinYoung

我在组内应用 sort_values() 和 cumsum() 时遇到问题。

我有一个数据集:

基本上,我需要对组内的值进行排序,获取累计销售额并选择构成销售额 90% 的行。

获得第一名

然后,只需在每个区域内选择 90% 的销售额

我尝试了以下方法,但最后一行不起作用。我返回错误:无法访问“SeriesGroupBy”对象的可调用属性“sort_values”,请尝试使用“apply”方法

我也试过申请..

import pandas as pd 
df = pd.DataFrame({'id':['id_1',  
'id_2','id_3','id_4','id_5','id_6','id_7','id_8', 'id_1',  
'id_2','id_3','id_4','id_5','id_6','id_7','id_8'], 
               'region':[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,], 
               'sales':[54,34,23,56,78,98,76,34,27,89,76,54,34,45,56,54]}) 
df['%']=df['sales']/df.groupby(df['region'])['sales'].transform('sum') 
df['cumul'] = df.groupby(df['region'])['sales'].sort_values(ascending=False).cumsum() 

谢谢大家的建议

请您参考如下方法:

你绝对可以先对数据框进行排序,然后再执行 groupby():

df.sort_values(['region','sales'], ascending=[True,False],inplace=True) 
 
df['%']=df['sales']/df.groupby(df['region'])['sales'].transform('sum') 
 
df['cummul'] = df.groupby('region')['%'].cumsum() 
 
# filter 
df[df['cummul'].le(0.9)] 

输出:

      id  region  sales         %    cummul 
5   id_6       1     98  0.216336  0.216336 
4   id_5       1     78  0.172185  0.388521 
6   id_7       1     76  0.167770  0.556291 
3   id_4       1     56  0.123620  0.679912 
0   id_1       1     54  0.119205  0.799117 
1   id_2       1     34  0.075055  0.874172 
9   id_2       2     89  0.204598  0.204598 
10  id_3       2     76  0.174713  0.379310 
14  id_7       2     56  0.128736  0.508046 
11  id_4       2     54  0.124138  0.632184 
15  id_8       2     54  0.124138  0.756322 
13  id_6       2     45  0.103448  0.859770