Pandas 分组总和的前 n %

Pandas Top n % of grouped sum

我在一家公司工作,我正在尝试计算 产品在不同年份占总收入的前 80%。

这是我的数据的一个简短示例:

Part_no Revision    Gross_Revenue   Year
1            a          1           2014
2            a          2           2014
3            c          2           2014
4            c          2           2014
5            d          2           2014

我一直在寻找各种答案,这是我能想到的最好的代码,但它不起作用:

df1 = df[['Year', 'Part_No', 'Revision', 'Gross_Revenue']]
df1 = df1.groupby(['Year', 'Part_No','Revision']).agg({'Gross_Revenue':'sum'})
# print(df1.head())
a = 0.8
df2 = (df1.sort_values('Gross_Revenue', ascending = False)
                .groupby(['Year', 'Part_No', 'Revision'], group_keys = False)
                .apply(lambda x: x.head(int(len(x) * a )))
                .reset_index(drop = True))
print(df2)

我正在尝试使用代码 return,代表每年为我们公司带来 80% 收入的所有顶级产品。

我怀疑这是旧的 80/20 规则。

感谢您的帮助, 我

您可以使用 cumsum

df[df.groupby('Year').Gross_Revenue.cumsum().div(df.groupby('Year').Gross_Revenue.transform('sum'),axis=0)<0.8]
Out[589]: 
   Part_no Revision  Gross_Revenue  Year
1        2        a              2  2014
2        3        c              2  2014
3        4        c              2  2014