为 Pandas DataFrame 中分类列创建按类别累计计数的新列

1次阅读

为 Pandas DataFrame 中分类列创建按类别累计计数的新列

本文介绍如何基于 pandas dataframe 中的字符串分类列(如 ‘cluster’),为每个唯一值动态生成独立的累计出现次数列,使用 get_dummies() 与 cumsum() 组合实现高效、可扩展的向量化计算。

本文介绍如何基于 pandas dataframe 中的字符串分类列(如 ‘cluster’),为每个唯一值动态生成独立的累计出现次数列,使用 get_dummies() 与 cumsum() 组合实现高效、可扩展的向量化计算。

数据分析和特征工程中,常需将离散标签列(如用户分组、状态标识、聚类结果)转化为其历史累计频次特征——例如,“该用户所属分组 S 在此前(含当前行)共出现多少次”。这类特征对时序建模、行为分析或在线学习场景至关重要。Pandas 提供了简洁高效的向量化方案,无需循环或 groupby.apply,即可一次性为所有类别生成对应累计列。

核心思路是:将分类列“一键展开”为独热编码(one-hot)矩阵,再沿行方向(axis=0)执行累积求和,最后重命名并合并回原表。整个过程完全向量化,性能优异且代码高度可读。

以下为完整实现示例:

import pandas as pd import random  # 构造示例数据(固定随机种子确保可复现) random.seed(42) df = pd.DataFrame({     'index': list(range(0, 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)  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

关键优势说明

  • pd.get_dummies() 自动识别 cluster 的所有唯一值(此处为 ‘S’ 和 ‘C’),生成对应布尔列;
  • .cumsum() 默认按索引顺序逐行累加,天然满足“截至当前行”的语义;
  • rename() 使用 f-String 动态添加前缀,便于后续特征命名管理;
  • pd.concat(…, axis=1) 横向拼接,保持原始索引对齐,零错位风险。

⚠️ 注意事项

  • 若原始列含缺失值(NaN),get_dummies() 默认会忽略(不生成对应列),如需保留可传入 dummy_na=True;
  • 列顺序取决于 get_dummies() 内部排序(字母序),若需严格控制列序,可在 rename 后用 reindex() 显式指定;
  • 对于超多类别(如千级标签),get_dummies() 可能引发内存压力,此时建议改用 pd.crosstab(…, rownames=[‘index’], colnames=[‘cluster’]).cumsum() 或分块处理。

该方法通用性强,适用于任意字符串、类别型(category)或数值型离散列,是 Pandas 特征构造中的经典范式之一。

text=ZqhQzanResources