1

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

例如: 示例数据透视表

我需要的是: 期望的输出

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

如果我需要添加总计来执行此操作,那也没关系,因为无论如何我稍后都会过滤掉结果。

4

3 回答 3

1

您的示例并没有真正显示索引中的内容而不是。

我制作了自己的数据集:

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'], inplace=True)

请注意,我也创建了 Team C。既然两个B队没有意义。我以为这是一个错误。

通过我的示例,您可以简单地执行以下操作:

df_percent = df / df.groupby(level=[0,1]).sum()
df_percent['outcome'] = df['outcome']

             outcome     week1     week2     week3
country team                                      
NL      A        WIN  0.222222  0.300000  0.363636
        A       LOSE  0.333333  0.200000  0.454545
        A       DRAW  0.444444  0.500000  0.181818
        B        WIN  0.363636  0.222222  0.300000
        B       LOSE  0.454545  0.333333  0.200000
        B       DRAW  0.181818  0.444444  0.500000
        C        WIN  0.400000  0.222222  0.300000
        C       LOSE  0.400000  0.333333  0.200000
        C       DRAW  0.200000  0.444444  0.500000
于 2015-08-14T14:56:04.463 回答
0

我假设您只是想为所有这三列添加百分比符号,考虑到它是一个数据框。如果是,您可以使用以下内容

df.week1 = df.week1.astype(str).add('%')
df.week2 = df.week2.astype(str).add('%')
df.week3 = df.week3.astype(str).add('%')
于 2018-06-20T15:58:19.030 回答
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]])

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

>>> 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
于 2015-08-14T15:23:00.917 回答