在一个组内按降序排序的累积和。熊猫

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

我有一个数据集:

在此处输入图像描述

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

获得第一

在此处输入图像描述

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

在此处输入图像描述

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


我也试过申请..


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()


米琪卡哇伊
浏览 171回答 3
3回答

一只甜甜圈

您绝对可以先对数据框进行排序,然后执行以下操作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()# filterdf[df['cummul'].le(0.9)]输出:      id  region  sales         %    cummul5   id_6       1     98  0.216336  0.2163364   id_5       1     78  0.172185  0.3885216   id_7       1     76  0.167770  0.5562913   id_4       1     56  0.123620  0.6799120   id_1       1     54  0.119205  0.7991171   id_2       1     34  0.075055  0.8741729   id_2       2     89  0.204598  0.20459810  id_3       2     76  0.174713  0.37931014  id_7       2     56  0.128736  0.50804611  id_4       2     54  0.124138  0.63218415  id_8       2     54  0.124138  0.75632213  id_6       2     45  0.103448  0.859770

小怪兽爱吃肉

首先,我们使用您的逻辑来创建列,%但我们multiply使用整数。100roundregion然后我们按and排序%,不需要groupby.排序后,我们创建cumul列。最后我们选择90%范围内的那些query:df['%'] = df['sales'].div(df.groupby('region')['sales'].transform('sum')).mul(100).round()df = df.sort_values(['region', '%'], ascending=[True, False])df['cumul'] = df.groupby('region')['%'].cumsum()df.query('cumul.le(90)')输出      id  region  sales     %  cumul5   id_6       1     98  22.0   22.04   id_5       1     78  17.0   39.06   id_7       1     76  17.0   56.00   id_1       1     54  12.0   68.03   id_4       1     56  12.0   80.01   id_2       1     34   8.0   88.09   id_2       2     89  20.0   20.010  id_3       2     76  17.0   37.014  id_7       2     56  13.0   50.011  id_4       2     54  12.0   62.015  id_8       2     54  12.0   74.013  id_6       2     45  10.0   84.0

慕尼黑5688855

如果您只需要没有百分比的销售数据,可以通过方法链接轻松完成:(  df  .sort_values(by='sales', ascending=False)  .groupby('region')  .apply(lambda x[x.sales > x.sales.quantile(.1)])  .reset_index(level=0, drop=True))输出      id  region  sales5   id_6       1     984   id_5       1     786   id_7       1     763   id_4       1     560   id_1       1     541   id_2       1     347   id_8       1     349   id_2       2     8910  id_3       2     7614  id_7       2     5611  id_4       2     5415  id_8       2     5413  id_6       2     4512  id_5       2     34这是有效的,因为获得大于 10% 的所有值与获得前 90% 的值基本相同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python