繁体   English   中英

如何每第 4 行将 append 列总计到 pandas dataframe?

[英]How to append column total to pandas dataframe every 4th row?

我有以下 dataframe 列 A、B 和 C 的每周编号:

week  A B C
0     1 0 0
1     1 0 1
2     0 1 0
3     1 1 1
4     1 0 0
5     0 0 1
6     0 1 0
7     1 1 1
8     1 0 0
9     0 0 1
10    0 1 0
11    1 1 1

我想 append dataframe 一行包含每列的每月总数(所以前 4 周一起),想要的结果是这样的:

week   A B C
0      1 0 0
1      1 0 1
2      0 1 0
3      1 1 1
total  3 2 2
4      1 0 0
5      0 0 1
6      1 1 0
7      2 1 0
total  4 2 1
8      1 0 0
9      0 0 1
10     0 0 0
11     1 0 1
total  2 0 2

我用过

df.groupby(df.index // 4).sum(numeric_only=True, axis=0)

获取每月的数字,但我不知道如何将它附加到 df 中。 有任何想法吗? 谢谢

pd.concat

遍历 groupby object 允许我们 append 到每个子数据帧的总行。 通过字典理解/ pd.concat传递它,我们可以方便地将month添加为索引中的一个级别,以消除索引中的'total'标识符的歧义。

pd.concat({
    m: d.append(d.sum().rename('total'))
    for m, d in df.groupby(df.index // 4)
}, names=['month'])

             A  B  C
month week          
0     0      1  0  0
      1      1  0  1
      2      0  1  0
      3      1  1  1
      total  3  2  2
1     4      1  0  0
      5      0  0  1
      6      0  1  0
      7      1  1  1
      total  2  2  2
2     8      1  0  0
      9      0  0  1
      10     0  1  0
      11     1  1  1
      total  2  2  2

我假设您的数据样本中的那一周是常规列(不是索引)。

您的代码只为每个组生成“总和”行,但正确的解决方案是:

  • 为当前组生成一个“总和”行,
  • 返回附加此行的原始组。

为此,定义一个 function 将“总”行添加到当前组并返回它:

def addTotal(grp):
    wrk = grp.loc[:, 'A':'C'].sum().append(
        pd.Series(['total'], index=['week'])).rename('total')
    return grp.append(wrk)

然后像到目前为止一样对源 DataFrame 进行分组并应用此 function:

result = df.groupby(df.index // 4, group_keys=False)\
    .apply(addTotal).reset_index(drop=True)

(另一个步骤是重置索引)。

对于您的数据样本,结果是:

     week  A  B  C
0       0  1  0  0
1       1  1  0  1
2       2  0  1  0
3       3  1  1  1
4   total  3  2  2
5       4  1  0  0
6       5  0  0  1
7       6  0  1  0
8       7  1  1  1
9   total  2  2  2
10      8  1  0  0
11      9  0  0  1
12     10  0  1  0
13     11  1  1  1
14  total  2  2  2

注意:您的数据样本与预期结果不一致。 例如 row == 7 ,列A有:

  • 1在数据样本中,
  • 2在预期的结果。

这解释了您的预期结果和我的预期结果之间的一些差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM