按年份分组计算DataFrame列排除当前行的累计和
解决按年份分组计算累计和(排除当前行)的问题
你现在用的df1.groupby('Year')['Value'].cumsum()会把当前行的Value也包含进去,所以结果不符合预期。要实现组内累计和排除当前行,可以用以下两种简单方法:
方法1:累计和减去当前行值
直接用分组累计和减去当前行的Value,就能得到到上一行的累计和:
df1['CumSum'] = df1.groupby('Year')['Value'].cumsum() - df1['Value']
这种方法逻辑直观,第一行的结果会是0(因为第一行累计和就是自身,减去自身后为0),符合“排除当前行后无数据则和为0”的预期。
方法2:用shift偏移累计和
先计算分组累计和,再用shift(1)把结果往下偏移一行,最后用fillna(0)填充第一行的空值:
df1['CumSum'] = df1.groupby('Year')['Value'].cumsum().shift(1).fillna(0)
这种方法更贴合“取当前行之前所有行的和”的逻辑,偏移后第一行没有前序数据,所以填充为0。
示例验证
假设你的DataFrame是这样的:
import pandas as pd df1 = pd.DataFrame({ 'Year': [2022, 2022, 2023, 2023, 2023], 'Value': [10, 20, 5, 15, 25] })
用方法1或方法2处理后,得到的CumSum列会是:
| Year | Value | CumSum |
|---|---|---|
| 2022 | 10 | 0 |
| 2022 | 20 | 10 |
| 2023 | 5 | 0 |
| 2023 | 15 | 5 |
| 2023 | 25 | 20 |
完全符合“排除当前行的组内累计和”的需求。
内容的提问来源于stack exchange,提问作者JP159
相关产品推荐
相关产品推荐

