Python中用qcut批量分箱数值变量的循环与ID保留问题求助
解决方案
问题分析
原代码的核心问题:
- 循环内直接替换原
df为单列分箱结果,导致后续循环丢失其他变量和ID,无法完成遍历 - 没有单独维护包含ID的结果数据集,导致最终无法保留ID
修正后的完整代码
import pandas as pd import numpy as np # 创建示例df df = pd.DataFrame({'id':[1,2,3,4,5,6,7,8,9,10], 'totals1':[200, 100, 300, 500, 1000, 50, 250, 550, 350, 950], 'totals2':[4500, 700, 600, 500, 900, 500, 150, 650, 450, 950]}) # 将id转换为object类型 df = df.astype({'id' : np.object}) # 获取数值变量列表 num_vars = df.select_dtypes(include=['int64']).columns.tolist() # 初始化结果DataFrame,仅保留ID列 result_df = df[['id']].copy() # 遍历所有数值变量执行分箱 for var in num_vars: # 定义分箱后列名(原变量名+_seg) seg_col = f"{var}_seg" # 用qcut分箱,labels=False返回0/1/2的分箱标识,添加到结果集 result_df[seg_col] = pd.qcut(df[var], 3, labels=False) # 查看最终结果 print(result_df)
关键改进点
- 单独创建
result_df存储结果,避免覆盖原数据,确保循环能持续读取原df中的数值变量 - 分箱列自动命名为原变量名+
_seg,便于识别 - 最终结果仅保留ID和所有分箱后的变量,完全符合需求
可选扩展:自定义分箱标签
如果需要用文字标签(如「低/中/高」)替代数字标识,只需修改qcut的labels参数:
result_df[seg_col] = pd.qcut(df[var], 3, labels=['低', '中', '高'])
内容的提问来源于stack exchange,提问作者BenBald
相关产品推荐
相关产品推荐

