
本文介绍如何基于 pandas 的分类列(如字符串类型)动态生成多个累计计数列,每列对应一个唯一类别,记录截至当前行该类别的出现总次数。方法简洁高效,仅需三步:独热编码、逐列累加、重命名合并。
本文介绍如何基于 pandas 的分类列(如字符串类型)动态生成多个累计计数列,每列对应一个唯一类别,记录截至当前行该类别的出现总次数。方法简洁高效,仅需三步:独热编码、逐列累加、重命名合并。
在数据分析中,常需按时间或顺序维度追踪某类事件的累计发生频次——例如监控用户行为中不同标签(如 'S'/'C')的累积出现次数。Pandas 提供了优雅的向量化方案,无需循环或 groupby().cumcount() 等复杂逻辑,即可为每个唯一值自动生成独立的累计列。
核心思路是:将分类列转换为二进制指示矩阵(即独热编码),再对每一列执行 cumsum(),最后重命名并合并回原表。以下是完整实现:
import pandas as pd
import random
# 构造示例数据(固定随机种子确保可复现)
random.seed(42)
df = pd.DataFrame({
'index': list(range(10)),
'cluster': [random.choice(['S', 'C']) for _ in range(10)]
})
# ✅ 三步法生成累计列
cum_counts = pd.get_dummies(df['cluster']).cumsum() # 对每个类别生成累计计数
cum_counts = cum_counts.rename(columns=lambda x: f'cumulative_{x}') # 统一列名前缀
df_final = pd.concat([df, cum_counts], axis=1) # 水平拼接至原 DataFrame
print(df_final)输出结果如下(与预期完全一致):
index cluster cumulative_C cumulative_S 0 0 S 0 1 1 1 S 0 2 2 2 C 1 2 3 3 S 1 3 4 4 S 1 4 5 5 S 1 5 6 6 S 1 6 7 7 S 1 7 8 8 C 2 7 9 9 S 2 8
✅ 关键优势:
- 自动适配类别数量:无论 cluster 包含 'S'/'C' 还是更多类别(如 'A', 'B', 'C'),pd.get_dummies() 均能动态生成对应列;
- 严格保序:cumsum() 按 DataFrame 行索引顺序计算,天然支持时间序列或有序业务逻辑;
- 零缺失值处理:get_dummies 默认忽略 NaN,若需保留空值逻辑,可添加 dummy_na=True 参数。
⚠️ 注意事项:
- 若原始列含空值(NaN),默认会被丢弃;如需将其作为一类参与累计,请显式设置 pd.get_dummies(..., dummy_na=True);
- 列名中的类别值若含特殊字符(如空格、点号),rename 后可能引发后续访问问题,建议预处理清洗类别名称;
- 对超大规模数据(千万级行),此方法仍保持高性能,因全程基于 NumPy 向量化运算,无 Python 层循环开销。
该方法是构建“分类状态快照”或“多维累计指标”的标准实践,适用于 A/B 测试分组追踪、日志事件聚合、客户生命周期阶段统计等典型场景。










