【问题标题】:Pandas- Create column based on sum of previous row valuesPandas-根据前一行值的总和创建列
【发布时间】:2021-08-12 06:54:25
【问题描述】:

样本数据集:

   id val
0   9   1
1   9   0
2   9   4
3   9   6
4   9   2
5   9   3
6   5   0
7   5   1
8   5   6
9   5   2
10  5   4

从数据集中,我想生成一个列sum。对于前 3 行:sum=sum+val(按 id 分组)。从第 4 行开始,每行包含val 列(按 id 分组)的前 3 行的累积和。循环遍历每一行。当出现新的id时,应该从头开始计算。

期望的输出:

    id  val sum
0    9    1   1
1    9    0   1
2    9    4   5
3    9    6  10
4    9    2  12
5    9    3  11
6    5    0   0
7    5    1   1
8    5    6   7
9    5    2   9
10   5    4  12

我试过的代码:

df['sum']=df['val'].rolling(min_periods=1, window=3).groupby(df['id']).cumsum()

如何计算自定义累积和函数?

【问题讨论】:

标签: pandas


【解决方案1】:

您确定预期的输出正确吗?

我愿意:

df['sum'] = df.groupby('id')['val'].rolling(min_periods=1, window=3).sum().values

输出:

    id  val   sum
0    5    1   1.0
1    5    0   1.0
2    5    4   5.0
3    5    6  10.0
4    5    2  12.0
5    5    3  11.0
6    9    0   0.0
7    9    1   1.0
8    9    6   7.0
9    9    2   9.0
10   9    4  12.0

【讨论】:

  • 如果你真的想要给定的输出,你可以使用shift来移动行。
  • 好的。但我想要 sum 列中的 int 数据类型。我该怎么做?
  • 使用(...).sum().astype(int).values 代替(...).sum().values
  • 我遇到了一个问题。当我更改 id 值 5 代替 9 和 9 代替 5 时,它应该给我与以前完全相同的输出。但是你的解决方案给了我有线的结果。你能检查一下吗?我已经编辑了我的数据集。
  • 我想你想将sort=False 作为参数添加到groupby
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2020-04-16
  • 1970-01-01
  • 2020-08-09
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多