![](/img/trans.png)
[英]How to select every 4th row in a pandas dataframe and calculate the rolling average
[英]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有:
这解释了您的预期结果和我的预期结果之间的一些差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.