为 Pandas DataFrame 中每个分类值创建独立的累计计数列

1次阅读

为 Pandas DataFrame 中每个分类值创建独立的累计计数列

本文介绍如何基于 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 测试分组追踪、日志事件聚合、客户生命周期阶段统计等典型场景。

text=ZqhQzanResources