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
我在一家公司工作,我正在尝试计算 产品在不同年份占总收入的前 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