在python pandas中添加group列的百分比

时间:2015-08-14 14:32:08

标签: python pandas pivot pandas-groupby

我在数据框中有一个数据透视表,我想计算组百分比。

例如: Sample pivot data

我需要的是: desired output

我已经排除了原始数据,但我希望有这些,我知道我需要添加这些列。

如果我需要添加总计来做到这一点也很好,因为无论如何我将在以后过滤结果。

2 个答案:

答案 0 :(得分:0)

将数据框除以每个国家/地区和团队的游戏数量之和,使用groupby获得并使用transform重新整形。

df = pd.DataFrame({'country': ["NL"] * 9, 
                   'team': ["A"] * 3 + ["B"] * 3 + ["C"] * 3, 
                   'outcome': ["WIN", "LOSE", "DRAW"] * 3, 
                   'week1': [2, 3, 4, 4, 5, 2, 4, 4, 2], 
                   'week2': [3, 2, 5, 2, 3, 4, 2, 3, 4], 
                   'week3': [4, 5, 2, 3, 2, 5, 3, 2, 5]})
df.set_index(['country', 'team', 'outcome'], inplace=True)

>>> df.divide(df.reset_index().groupby(['country', 'team']).transform(sum).values)
                         week1     week2     week3
country team outcome                              
NL      A    WIN      0.222222  0.300000  0.363636
             LOSE     0.333333  0.200000  0.454545
             DRAW     0.444444  0.500000  0.181818
        B    WIN      0.363636  0.222222  0.300000
             LOSE     0.454545  0.333333  0.200000
             DRAW     0.181818  0.444444  0.500000
        C    WIN      0.400000  0.222222  0.300000
             LOSE     0.400000  0.333333  0.200000
             DRAW     0.200000  0.444444  0.500000

为了更清楚,您可以看到transform正在做什么。它以与原始数据帧相同的形状返回结果。

>>> df.reset_index().groupby(['country', 'team']).transform(sum).values
array([[ 9, 10, 11],
       [ 9, 10, 11],
       [ 9, 10, 11],
       [11,  9, 10],
       [11,  9, 10],
       [11,  9, 10],
       [10,  9, 10],
       [10,  9, 10],
       [10,  9, 10]])

你也可以在@ firelynx提出的方法中使用transform并跳过他的最后一步:

>>> df.divide(df.groupby(level=[0,1]).transform(sum))

                         week1     week2     week3
country team outcome                              
NL      A    WIN      0.222222  0.300000  0.363636
             LOSE     0.333333  0.200000  0.454545
             DRAW     0.444444  0.500000  0.181818
        B    WIN      0.363636  0.222222  0.300000
             LOSE     0.454545  0.333333  0.200000
             DRAW     0.181818  0.444444  0.500000
        C    WIN      0.400000  0.222222  0.300000
             LOSE     0.400000  0.333333  0.200000
             DRAW     0.200000  0.444444  0.500000

答案 1 :(得分:0)

我假设您只是想将百分比符号添加到所有这三列中,并将其视为一个数据框。如果是,则可以使用以下

df.week1 = df.week1.astype(str).add('%')
df.week2 = df.week2.astype(str).add('%')
df.week3 = df.week3.astype(str).add('%')