划分数据帧

时间:2018-12-23 02:52:15

标签: python pandas

数据:

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)。 如果还有其他方法,请提供帮助。

1 个答案:

答案 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