pandas使用pd.qcut分箱后按箱均值平滑及添加箱边界列的实现方法
Pandas 等频分箱后的衍生值计算实现
前置准备
基于题目给定的示例构造测试数据,生成与使用习惯一致的等频分箱结果:
import pandas as pd import numpy as np # 题目指定的原始目标列 target_col = pd.Series([4, 8, 15, 21, 21, 24, 25, 28, 34]) # 按3等频生成分箱分组,与日常使用的 pd.qcut(col, 3) 逻辑完全一致 bin_group = pd.qcut(target_col, q=3)
功能1:分箱内均值替换的数值平滑
直接基于分箱分组使用transform方法计算组内均值,pandas会自动将均值广播到组内所有原始值,无需手动构建分箱与均值的映射表:
# 生成平滑后的列 col_smoothed = target_col.groupby(bin_group).transform("mean")
运行结果与题目示例完全匹配:[9, 9, 9, 22, 22, 22, 29, 29, 29]
该方法会自动按索引对齐值,避免手动映射时出现的顺序错位问题。
功能2:匹配每个值所属分箱的最近边界值
首先基于分箱分组计算每个组的实际极值:组内最小值为分箱左边界,组内最大值为分箱右边界,再计算原始值到两个边界的距离,选取距离更近的边界即可。
# 计算每个分箱的实际边界 bin_left = target_col.groupby(bin_group).transform("min") bin_right = target_col.groupby(bin_group).transform("max") # 计算值到两个边界的距离 distance_left = target_col - bin_left distance_right = bin_right - target_col # 选取距离更近的边界作为结果 col_nearest_boundary = np.where(distance_left <= distance_right, bin_left, bin_right)
运行结果与题目示例完全匹配:[4, 4, 15, 21, 21, 24, 25, 25, 34]
当值到两个边界的距离相等时,上述逻辑会默认选取左边界,可根据实际需求调整判断条件。
内容的提问来源于stack exchange,提问作者Blaine
相关产品推荐
相关产品推荐

