You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按分类列分组计算datetime列日期前的C列累计值?

解决方案:分组后计算累计求和

针对你的需求,完全不需要用合并数据集的方法,直接通过pandas的分组+累计求和就能高效解决,这种方法时间复杂度低,适合大规模数据集。

核心思路

  1. 按分类列A分组,确保每个类别单独处理;
  2. 在每个分组内,先按日期列B排序(保证日期顺序正确,累计求和依赖时序);
  3. 对数值列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结果列
category12022-01-021.0
category12022-03-043.0
category12022-07-106.0
category12022-08-1510.0
category22022-03-045.0
category22022-07-1011.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:09