【问题标题】:Sum all value columns and add total row in df based on groups根据组对所有值列求和并在 df 中添加总行
【发布时间】:2020-09-29 22:40:13
【问题描述】:

我有一个如下所示的 df。

tmp = [('A','a', 1,1,0), ('A','b', 2,1,0), ('A','c', 3,2,1), ('B','a', 1,2,3), ('B','b', 0,1,2)]
df = pd.DataFrame(tmp, columns=['Col1', 'Col2', 'Val1', 'Val2', 'Val3'])

输出:

    Col1    Col2    Val1    Val2    Val3
0   A   a   1   1   0
1   A   b   2   1   0
2   A   c   3   2   1
3   B   a   1   2   3
4   B   b   0   1   2

我想根据 col1 分组对 val1、val2 和 val3 中的值求和。我可以使用以下内容正确格式化一列。

tmp = tmp.groupby(['Col1','Col2'])['Val1'].sum().unstack()
tmp = tmp.assign(Total=tmp.sum(1)).stack().to_frame('Val1')

输出:

    Val1
Col1    Col2    
A   a   1.00
    b   2.00
    c   3.00
Total   6.00
B   a   1.00
    b   0.00
Total   1.00

我的目标是在上述 df 中添加 Val2 和 Val3 列,但我一直无法找到将上述方法链接在一起的干净方法。非常感谢任何帮助。

预期输出:

              Val1  Val2  Val3 
Col1    Col2    
A         a   1.00  1.00  0.00
          b   2.00  1.00  0.00
          c   3.00  2.00  1.00
Total         6.00  4.00  1.00
B         a   1.00  2.00  3.00
          b   0.00  1.00  2.00
Total         1.00  3.00  5.00

【问题讨论】:

标签: python python-3.x pandas


【解决方案1】:

方法一:

您可以使用 BEN_YO 在 cmets 中链接的 pivot_table 方法,在这种情况下,我们必须使用 GroupBy.apply,因为我们想将它分别应用于每个组:

df.groupby('Col1').apply(
    lambda x: x.pivot_table(
        index=['Col1', 'Col2'], 
        aggfunc='sum', 
        margins=True,
        margins_name='Total')
)

                 Val1  Val2  Val3
Col1 Col1  Col2                  
A    A     a        1     1     0
           b        2     1     0
           c        3     2     1
     Total          6     4     1
B    B     a        1     2     3
           b        0     1     2
     Total          1     3     5

方法二:

我们可以遍历我们的组并使用.loc 来添加我们的总数:

grps = df.groupby(['Col1'])
dfs = []
for _, grp in grps:
    grp = grp.set_index(['Col1', 'Col2'])
    grp.loc[('', 'Total'), :] = grp.sum()
    dfs.append(grp)

pd.concat(dfs)

            Val1  Val2  Val3
Col1 Col2                   
A    a       1.0   1.0   0.0
     b       2.0   1.0   0.0
     c       3.0   2.0   1.0
     Total   6.0   4.0   1.0
B    a       1.0   2.0   3.0
     b       0.0   1.0   2.0
     Total   1.0   3.0   5.0

【讨论】:

    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多