Python Sklearn KBinsDiscretizer保留原始列名

Python Sklearn KBinsDiscretizer保留原始列名,python,python-3.x,pandas,scikit-learn,sklearn-pandas,Python,Python 3.x,Pandas,Scikit Learn,Sklearn Pandas,我正在研究一个机器学习问题,我正在使用Sklearn-KBinsDiscretizer离散化一些连续变量 discretizer = KBinsDiscretizer(n_bins=8, encode='onehot') discretizer.fit(dfDisc) discretizer.transform(X_train) 在转换之前,my X_train.columns返回: ["A", "B", "C", "D&

我正在研究一个机器学习问题,我正在使用Sklearn-KBinsDiscretizer离散化一些连续变量

discretizer = KBinsDiscretizer(n_bins=8, encode='onehot')
discretizer.fit(dfDisc)

discretizer.transform(X_train)
在转换之前,my X_train.columns返回:

["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
转换后(并作为df放回),X_train.columns给出:

[0, 1, 2, 3, 4, 5, ......, 66, 67, 68]
由于我是按变量的原始名称(A、B、C、…、J)来分析变量的,并且必须给出关于哪些变量用于分类的反馈,所以我正在寻找一种方法来知道哪个变量和哪个数量的输出相关联。例如,我希望将输出X_train.columns转换为

["A_0", "A_1", "A_2", "A_3", "A_4", "B_0", "B_1", "B_2", "B_3", ... ]
我知道在使用sklearn-onehotcoder(get_-feature_-names)时存在这样的命令,但我找不到任何使用KBinsDiscretizer的方法

discretizer = KBinsDiscretizer(n_bins=8, encode='onehot')
discretizer.fit(dfDisc)

discretizer.transform(X_train)
我必须解决这个问题的一个想法是为每个变量创建一个特定的离散化程序,然后将相关的离散化程序应用于每一列,并在合并所有内容之前手动重命名列,但这将是一个混乱,因为我必须保存我的离散化程序


此外,即使我指定n_bins=8,我的10个条目中有69个输出列,因此1个条目并不总是产生10个输出,我也不能使用它来设置列名称。

有时
KBinsDiscretizer
不会为每个列/条目准确返回
n_bins
。例如,当我运行以下代码时:

np.random.seed(0)
df = pd.DataFrame(np.random.randint(1, 200, size=(30, 10)), 
                  columns=["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"])
df['B'] = np.random.randint(1, 4, size=30)  # Set only 3 unique values

discretizer = KBinsDiscretizer(n_bins=8, encode='onehot')
discretizer.fit(df)
我得到这个警告:


宽度太小的垃圾箱(即,我找到了一种避免使用离散化的方法,但非常感谢您的回答,我想我可以解决这个问题。
dft = pd.SparseDataFrame(
    discretizer.transform(df), 
    columns=[f'{col}_{b}' for col, bins in zip(df.columns, discretizer.n_bins_) for b in range(bins)]
)