如何对Python DataFrame每列应用pandas.qcut并实现自动化分箱编码
pandas批量分箱+自动生成哑变量实现方案
步骤1:批量执行qcut分箱,替换逐列硬编码
无需逐列提取Series调用qcut,直接用apply批量处理所有列:
import pandas as pd # 你的示例DataFrame df = pd.DataFrame({ 'PC1' : [0.035182, 0.001649, -0.080456, 0.056460, 0.017737, -0.005615, 0.033691, 0.547145, -0.022938, -0.059511], 'PC2': [0.034898, 0.001629, -0.083374, 0.053976, 0.017603,-0.005902, 0.006798, 0.250167, -0.137955, -0.313852], 'PC3': [0.032212, 0.001591, -0.067145, 0.047500, 0.015782, -0.003079, 0.012376, 0.302485, -0.063795, -0.124957], 'PC4' : [-0.000632,0.001268,0.063346,-0.026841,-0.009790,0.029897,-0.018870,-0.449655,0.081417,-0.327028], 'PC5' : [0.020340,0.001734,-0.050830,0.008507,0.007470,0.013534,0.100008,1.083280,0.298315,0.736401], 'PC6' : [0.027012,0.001507,-0.036496,0.032256,0.012207,0.005451,0.081582,0.959821,0.337683,0.758737], 'PC7' : [0.027903,0.001625,-0.041970,0.039854,0.014676,0.002364,0.045583,0.620938,0.116647,0.214294], 'PC8' : [0.013828,-0.015836,-0.117484,-0.208933,-0.162090,-0.190467,-0.075784,-0.481607,-0.213148,-0.401169], 'PC9' : [0.009378,0.002712,-0.148531,0.040901,0.011923,-0.000078,-0.055367,-0.661758,0.242363,-0.392438], 'PC10' : [-0.002740,-0.000234,0.060118,0.027855,0.016309,0.009850,-0.108481,-1.560047,0.198750,-0.793165], 'PC11' : [-2.876278,-0.437754,0.764775,-0.627843,0.391284,0.090675,-0.007820,0.342359,0.052004,-0.200808], 'PC12' : [-2.411929,-0.414697,0.415683,-0.426348,0.302643,-0.160550,-0.051552,1.086344,-0.275267,1.219304] }) # 统一配置qcut参数 qcut_params = dict(q=2, labels=None, retbins=False, precision=3, duplicates='raise') # 批量对所有列执行qcut,直接得到分箱后的DataFrame X = df.apply(lambda col: pd.qcut(col, **qcut_params), axis=0)
步骤2:提取各列区间边界
不需要单独存区间字符串,直接提取每个区间的左右边界数值,供后续生成判断逻辑使用:
# 存储结构:键为列名,值为该列所有区间的(left, right)元组列表 col_bins = {} for col in X.columns: # 从分箱结果的有序分类中提取区间,避免unique乱序问题 bins = [(interval.left, interval.right) for interval in X[col].cat.categories] col_bins[col] = bins
步骤3:改造自定义Transformer,自动生成哑变量
将预计算的col_bins作为初始化参数传入转换器,循环批量生成所有np.where逻辑,完全替换硬编码:
from sklearn.base import BaseEstimator, TransformerMixin import numpy as np class WoE_Binning(BaseEstimator, TransformerMixin): def __init__(self, col_bins, ref_categories): self.col_bins = col_bins self.ref_categories = ref_categories def fit(self, X, y = None): return self def transform(self, X): X_new = X.loc[:, 'grade:A': 'grade:G'].copy() # 遍历所有列和对应区间,自动生成哑变量 for col, bins in self.col_bins.items(): for left, right in bins: col_name = f"{col}:{left} - {right}" X_new[col_name] = np.where( (X[col] > left) & (X[col] <= right), 1, 0 ) X_new.drop(columns = self.ref_categories, inplace = True) return X_new
调用示例
# 替换为你自己的参考类别列表 ref_categories = [] # 实例化转换器 woe_transformer = WoE_Binning(col_bins=col_bins, ref_categories=ref_categories) # 执行转换 X_processed = woe_transformer.transform(df)
内容的提问来源于stack exchange,提问作者Anwar San
相关产品推荐
相关产品推荐

