
本文介绍如何基于分类列(如字符串类型)为每个唯一取值动态生成对应的累计出现次数列,使用 pd.get_dummies() 与 cumsum() 高效实现,无需循环或分组,结果可直接拼接回原 dataframe。
本文介绍如何基于分类列(如字符串类型)为每个唯一取值动态生成对应的累计出现次数列,使用 pd.get_dummies() 与 cumsum() 高效实现,无需循环或分组,结果可直接拼接回原 dataframe。
在数据分析中,常需追踪某分类变量(如用户分群、状态标签、产品类型)在时间或序号维度上的累计出现频次。例如,对 'cluster' 列中的 'S' 和 'C' 分别统计截至当前行的出现总次数,并作为新列加入原始 DataFrame —— 这类需求无法直接通过 groupby().cumcount() 满足,因为后者按组内顺序计数,而非全局跨组累计。
核心思路是:将分类列独热编码(One-Hot Encoding),转化为布尔指示矩阵,再对每列执行逐行累积求和,即可自然获得各分类值的累计频次。
以下为完整实现代码:
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
✅ 优势说明:
- 自动适配:无论 cluster 包含 2 个还是 N 个唯一值(如 ['A','B','C','D']),代码无需修改,均可生成对应 cumulative_A, cumulative_B 等列;
- 高效稳定:底层基于向量化运算,性能远优于 apply() 或 for 循环;
- 语义清晰:列名自带前缀,便于后续筛选(如 df_final.filter(regex='^cumulative_'))。
⚠️ 注意事项:
- 若原始分类列含缺失值(NaN),pd.get_dummies() 默认会忽略,导致对应行所有累计列为 0;如需保留 NaN 语义,应先用 df['cluster'].fillna('MISSING') 处理;
- 列顺序默认按字母序排列(如 'C' 在 'S' 前),若需自定义顺序,可在 get_dummies() 中传入 columns=['C','S'] 显式指定;
- 此方法生成的是全局累计(从第 0 行开始累加),若需按某索引排序后累计,请先调用 df.sort_values(by='your_time_col') 再执行。
该方案简洁、健壮且易于扩展,是 Pandas 中处理“按类别动态累计计数”任务的标准实践。










