Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中添加组列的百分比_Python_Pandas_Pivot_Pandas Groupby - Fatal编程技术网

在python中添加组列的百分比

在python中添加组列的百分比,python,pandas,pivot,pandas-groupby,Python,Pandas,Pivot,Pandas Groupby,我在数据框中有一个数据透视表,我想计算组百分比 例如: 我需要的是: 我已经排除了原始数据,但我希望有这些数据,我知道我需要在这些列中添加这些数据 如果我需要添加总计来完成这项工作,那也没关系,因为我将在以后过滤结果。您的示例没有真正显示索引中的内容,也没有显示 我制作了自己的数据集: df = pd.DataFrame({'country':["NL"]*9, 'team':["A"]*3+["B"]*3+["C"]*3, 'outcome':["WIN", "LOSE", "DRAW"]

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

例如:

我需要的是:

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


如果我需要添加总计来完成这项工作,那也没关系,因为我将在以后过滤结果。

您的示例没有真正显示索引中的内容,也没有显示

我制作了自己的数据集:

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)
注意,我也组建了一个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

将数据帧除以每个国家和团队的游戏数量之和,使用
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提出的方法中使用
转换
,跳过他的最后一步:

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

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

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