如何按分类列分组计算datetime列日期前的C列累计值?
解决方案:分组后计算累计求和
针对你的需求,完全不需要用合并数据集的方法,直接通过pandas的分组+累计求和就能高效解决,这种方法时间复杂度低,适合大规模数据集。
核心思路
- 按分类列A分组,确保每个类别单独处理;
- 在每个分组内,先按日期列B排序(保证日期顺序正确,累计求和依赖时序);
- 对数值列C计算累计求和(cumsum),得到的就是当前行日期及之前所有C值的总和。
代码实现
import pandas as pd # 构造示例数据集 data = { "列A": ["category1", "category1", "category1", "category1", "category2", "category2"], "列B": ["2022-01-02", "2022-03-04", "2022-07-10", "2022-08-15", "2022-03-04", "2022-07-10"], "列C": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } df = pd.DataFrame(data) df["列B"] = pd.to_datetime(df["列B"]) # 确保日期类型正确 # 高效写法:先排序再用transform计算累计和 df = df.sort_values(["列A", "列B"]) df["结果列"] = df.groupby("列A")["列C"].transform("cumsum") # 输出结果 print(df[["列A", "列B", "结果列"]])
输出结果
| 列A | 列B | 结果列 |
|---|---|---|
| category1 | 2022-01-02 | 1.0 |
| category1 | 2022-03-04 | 3.0 |
| category1 | 2022-07-10 | 6.0 |
| category1 | 2022-08-15 | 10.0 |
| category2 | 2022-03-04 | 5.0 |
| category2 | 2022-07-10 | 11.0 |
关于aggregation/lambda的说明
- 上述代码用的
transform属于pandas的聚合变换操作,性能远优于合并数据集的方法,也比groupby.apply+lambda更高效,尤其适合百万级以上的大规模数据集; - 如果一定要用lambda写法,也可以实现,但效率略低:
df["结果列"] = df.groupby("列A").apply( lambda x: x.sort_values("列B")["列C"].cumsum() ).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者johanna
相关产品推荐
相关产品推荐

