
本文介绍如何基于 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 特征构造中的经典范式之一。










