You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas高效统计多列指定值出现次数并生成计数新列的方法

高效统计多列罪名代码出现次数的Pandas实现

问题背景

  • 数据集包含多个存储囚犯刑事罪名代码(例:90、120、10)的字段,受数据采集阶段的复杂问卷路由逻辑影响,这类字段填充率极低、稀疏性很强
  • 数据需完成编码后才能输入机器学习模型,若直接按「罪名存储列数 × 罪名代码总数」维度做常规独热编码,生成的数据集稀疏度过高,无法满足使用要求
  • 目标需求:为每一个罪名代码单独创建对应列,逐行统计该罪名代码在所有罪名存储列中的出现次数,将计数结果填充到对应新列
  • 原有实现思路是将DataFrame转换为字典后遍历统计,运行效率极低,不符合Pandas最佳实践,且代码存在多处语法、逻辑错误

最优实现方案

完全不需要手写逐行/逐列循环,使用Pandas内置的向量化操作即可完成,性能比手写循环高1~2个数量级,代码更简洁易维护:

import pandas as pd

# 提取所有存储罪名代码的列子集
offense_cols_subset = dataset[offense_columns]

# 核心逻辑:展平多列后做独热编码,再按原行索引求和得到每个罪名的出现次数
offense_count_df = pd.get_dummies(
    offense_cols_subset.stack(),
    prefix="",
    prefix_sep=""
).groupby(level=0).sum()

# 合并回原数据集,删除原有稀疏的罪名存储列
# 注意Pandas默认不原地修改DataFrame,需要赋值接收结果
dataset = dataset.drop(columns=offense_columns).join(offense_count_df)

实现逻辑说明

  • stack()会把所有罪名列展平为双层索引的序列,自动丢弃空值(NaN/None),天然适配高稀疏字段的场景,不会给空值生成无效列
  • pd.get_dummies()会自动识别所有出现过的罪名代码,为每个代码生成独立的0/1列,不需要提前手动枚举所有罪名值
  • groupby(level=0).sum()按原行索引分组求和,直接得到每行每个罪名代码的出现总次数,结果列的列名就是对应的罪名代码
  • 全流程都是Pandas底层C实现的向量化运算,没有Python层的显式循环,十万级以上数据量的运行速度比字典遍历写法快几十到上百倍

原手写代码的常见错误

  • 收集全量罪名代码的循环逻辑错误:初始为空的all_possible_offense_codes列表直接调用.values()会直接抛出异常
  • 字典取值语法错误:to_dict(orient='index')生成的字典键只有行索引,offense_cols_dict[row,column]的写法无法取到对应值
  • 存在多处拼写错误:变量名this_row_offense_offense_counts重复前缀、Pandas库名错写为pf、orient=index参数值未加引号
  • DataFrame操作未接收返回值:join和drop默认不修改原DataFrame,不赋值的话所有操作都不会生效

内容的提问来源于stack exchange,提问作者SecondStar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:57:22