Python中如何遍历pandas DataFrame列自动生成分箱哑变量特征?
自动生成qcut分箱哑变量的实现方案
直接通过遍历存储了列名与对应分箱区间的映射结构即可实现批量生成,无需硬编码每一列的判断规则,具体实现逻辑如下:
前期准备:统一存储分箱区间
首先将所有PC列的qcut分箱结果存入一个字典,键为列名,值为对应列的分箱区间列表:
import pandas as pd import numpy as np from sklearn.base import BaseEstimator, TransformerMixin # 示例:假设你的原始PC特征列名列表为pc_cols pc_cols = [col for col in X.columns if col.startswith('PC')] bin_dict = {} # 存储每列的分箱区间 for col in pc_cols: # 执行qcut二分箱,retbins=True返回区间边界 _, bins = pd.qcut(X[col], q=2, retbins=True, duplicates='drop') # 存储区间(a,b]的边界a、b bin_dict[col] = [(bins[i], bins[i+1]) for i in range(len(bins)-1)]
批量生成哑变量逻辑
遍历bin_dict中的列与区间,自动生成对应哑变量:
def generate_binning_dummies(X, bin_dict): X_new = X.copy() for col, bin_intervals in bin_dict.items(): for a, b in bin_intervals: # 自动生成列名,保留列名与区间信息 col_name = f"{col}:{a:.3f} - {b:.3f}" # 自动赋值哑变量 X_new[col_name] = np.where((X[col] > a) & (X[col] <= b), 1, 0) return X_new
集成到自定义WoE_Binning Transformer
可以直接把上述逻辑封装进Transformer的fit和transform方法中,实现可复用的分箱哑变量生成能力:
class WoE_Binning(BaseEstimator, TransformerMixin): def __init__(self, q=2): # 支持自定义分箱数,默认二分箱 self.q = q self.bin_dict = None def fit(self, X, y=None): pc_cols = [col for col in X.columns if col.startswith('PC')] self.bin_dict = {} for col in pc_cols: _, bins = pd.qcut(X[col], q=self.q, retbins=True, duplicates='drop') self.bin_dict[col] = [(bins[i], bins[i+1]) for i in range(len(bins)-1)] return self def transform(self, X): X_new = X.copy() for col, bin_intervals in self.bin_dict.items(): for a, b in bin_intervals: col_name = f"{col}:{a:.3f} - {b:.3f}" X_new[col_name] = np.where((X[col] > a) & (X[col] <= b), 1, 0) # 可以根据需求选择是否保留原始PC列 # X_new = X_new.drop(columns=[col for col in self.bin_dict.keys()]) return X_new
调用方式
# 初始化转换器 bin_transformer = WoE_Binning(q=2) # 训练集拟合 bin_transformer.fit(X_train) # 训练集/测试集批量生成哑变量 X_train_binned = bin_transformer.transform(X_train) X_test_binned = bin_transformer.transform(X_test)
该实现可自适应任意数量的PC列,分箱区间自动从qcut结果中提取无需手动录入,支持跨数据集复用,符合sklearn转换器规范可直接接入Pipeline流水线。
内容的提问来源于stack exchange,提问作者Anwar San
相关产品推荐
相关产品推荐

