更高效率实现:按指定变量分组后多列value_counts的百分比统计
优化实现方案
方案核心思路
避免宽表转长表生成超大规模中间表,改为按id分组后直接对当前分组的所有特征批量统计频率,内存占用直接下降2-3个数量级,完全适配你的数据规模。
实现代码
import pandas as pd import numpy as np # 业务预定义离散取值 possible_values = [1, 2, 3, 4, 5] # 单id分组内的统计逻辑 def calc_id_feature_freq(group): # 取当前分组的id current_id = group["id"].iloc[0] # 去掉id列后批量统计所有特征的取值计数 feat_counts = group.drop("id", axis=1).apply(pd.value_counts).T # 补全所有可能的离散取值,避免部分取值无计数导致列缺失 for val in possible_values: if val not in feat_counts.columns: feat_counts[val] = 0 # 计数转频率 feat_freq = feat_counts[possible_values] / group.shape[0] # 格式化输出结构 feat_freq = feat_freq.reset_index().rename(columns={"index": "feature"}) feat_freq.insert(0, "id", current_id) return feat_freq # 按id分组应用统计逻辑,直接得到最终结果 feature_freq_id = df.groupby("id", group_keys=False).apply(calc_id_feature_freq).reset_index(drop=True)
方案优势
- 无超大规模中间表生成:不需要做melt操作,不会出现2.5亿行的中间数据,内存峰值仅为原方案的1%以下
- 计算效率更高:避免了长表转换、多维度交叉表计算的额外开销,同等数据规模下运行速度比原方案快3-5倍
- 可扩展性强:后续数据规模继续扩大时,可进一步结合分块读取逻辑适配全量数据集。
超大数据量扩展方案(可选)
如果后续数据量达到千万行级别无法一次性读入内存,可以用分批计数+全局汇总的逻辑:
from collections import defaultdict # 初始化全局计数存储:key为(id, feature, value),value为总次数 global_counter = defaultdict(int) # 初始化每个id的观测数统计 id_total = defaultdict(int) # 分批读取csv,可根据内存调整批次大小 chunk_size = 10000 for chunk in pd.read_csv("你的数据集路径.csv", chunksize=chunk_size): # 统计当前批次每个id的观测数 batch_id_cnt = chunk["id"].value_counts() for id_val, cnt in batch_id_cnt.items(): id_total[id_val] += cnt # 统计当前批次每个id每个特征的取值计数 for id_val, group in chunk.groupby("id"): feat_counts = group.drop("id", axis=1).apply(pd.value_counts).T for feat in feat_counts.index: for val in possible_values: cnt = feat_counts.loc[feat, val] if val in feat_counts.columns else 0 if cnt > 0: global_counter[(id_val, feat, val)] += cnt # 汇总计算最终频率 res_list = [] for (id_val, feat, val), cnt in global_counter.items(): res_list.append({ "id": id_val, "feature": feat, val: cnt / id_total[id_val] }) # 转成和预期一致的结构化表 feature_freq_id = pd.DataFrame(res_list).pivot( index=["id", "feature"], columns=possible_values ).reset_index()
内容的提问来源于stack exchange,提问作者Nickkon
相关产品推荐
相关产品推荐

