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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:27:00