数据:
year month is_p segment x y
2018 JAN Y de 200 500
2018 JAN N de 100 200
2018 JAN N de 500 500
2018 JAN Y de 1000 500
预期输出:
year month segment is_p x y %of allocation_x %of allocation_y
2018 JAN de N 600 700 0.333333 0.411765
Y 1200 1000 0.666667 0.588235
我尝试过的事情: 我进行了分组,并取了所有Y的值之和。求和后,我将y的贡献除以总和。
df_p=df.groupby([year,month,is_p,segment]).sum()
# To get the total sum for Y & N for is_p column
df_total=df.groupby([year,month,segment]).sum()
# To get the total sum per segment.
现在,我想获取相对于x,y
列的值的百分比(列-is_p
)。
如果还有其他方法,请提供帮助。
答案 0 :(得分:0)
这是我的解决方案!
首先在['year','month','segment']
上进行分组,然后在每个组内获得关于is_p
的x和y的总和。使用总和,然后获得每个子类别的百分比
d=''' year month is_p segment x y
2018 JAN Y de 200 500
2018 JAN N de 100 200
2018 JAN N de 500 500
2018 JAN Y de 1000 500
2019 JAN Y de 200 500
2019 JAN N de 100 2000
2019 JAN N de 5000 500
2019 JAN Y de 1000 500'''
df = pd.read_csv(pd.compat.StringIO(d), sep='\s+')
def f(x):
grouped = x.groupby('is_p').agg(sum)
for c in grouped.columns:
grouped['%of allocation'+str(c)] = grouped[c]/grouped[c].sum()
return grouped
interested_cols =['x','y']
df.groupby(['year','month','segment'])[['is_p']+interested_cols].apply(f)
输出:
x y %of allocation_x %of allocation_y
year month segment is_p
2018 JAN de N 600 700 0.333333 0.411765
Y 1200 1000 0.666667 0.588235
2019 JAN de N 5100 2500 0.809524 0.714286
Y 1200 1000 0.190476 0.285714