我有一个数据框,其中包含每个国家/地区的产品列表和相关销售额 我需要为每个国家/地区确定最畅销的商品中有#个,其累计销售额占每个国家所有商品总销售额的80%。
例如
Cnt Product, units
Italy apple 500
Italy beer 1500
Italy bread 2000
Italy orange 3000
Italy butter 3000
预期结果
Italy 3
(总数为10.000,排名前三位的产品-黄油,橙子,面包的销售额为8.000,占总数的80%)
答案 0 :(得分:1)
尝试定义一个函数并应用于groupby:
def get_sale(x, pct=0.8):
thresh = 0.8 * x.sum()
# sort values descendingly for top salse
x=x.sort_values(ascending=False).reset_index(drop=True)
# store indices of those with cumsum pass threshold
sale_pass_thresh = x.index[x.cumsum().ge(thresh)]
return sale_pass_thresh[0] + 1
df.groupby('Cnt').units.apply(get_sale)
输出:
Cnt
Italy 3
Name: units, dtype: int64
答案 1 :(得分:0)
需要在这里玩一些逻辑
df=df.sort_values('units',ascending=False)
g=df.groupby('Cnt').units
s=(g.cumsum()>=g.transform('sum')*0.8).groupby(df.Cnt).sum()
df.groupby('Cnt').size()-s+1
Out[710]:
Cnt
Italy 3.0
dtype: float64