如何使用pandas将8取值的教育水平分类变量重编码为4类?
pandas按规则重编码多分类教育水平变量
假设你存储数据的DataFrame对象名为df,原始分类字段为X025,以下三种方法都可以实现你需要的重编码逻辑,可根据使用习惯选择:
方法1:numpy.select 逻辑最直观
这种写法将判断条件和对应赋值一一对应罗列,后续调整规则时不容易出错,是最推荐的写法:
import numpy as np # 按顺序编写判断条件、对应赋值 cond_list = [ df['X025'].isin([1, 2]), df['X025'].isin([3, 4, 5, 6]), df['X025'].isin([7, 8]), df['X025'] < 1 ] value_list = [1, 2, 3, 4] # 生成新列,若不需要保留原字段可以直接赋值给df['X025']覆盖 df['edu_level'] = np.select(cond_list, value_list, default=np.nan)
参数里的default=np.nan是给X025取值大于8的异常值填充空值,如果你确定原始数据没有超出1-8范围的取值,可以删掉这个参数。
方法2:pandas.cut 适合数值分段场景
因为X025是整数型分类值,用分箱方法也可以快速实现,代码更简洁:
import numpy as np df['edu_level'] = pd.cut( df['X025'], bins=[-np.inf, 1, 3, 7, 9], # 按左闭右开规则划分区间 labels=[4, 1, 2, 3], # 区间和赋值一一对应 right=False ).astype(int) # 把分箱返回的分类类型转成整数
区间匹配逻辑:
- X025 < 1 → 匹配
[-inf, 1)区间 → 赋值4 - 1 ≤ X025 ≤ 2 → 匹配
[1, 3)区间 → 赋值1 - 3 ≤ X025 ≤ 6 → 匹配
[3, 7)区间 → 赋值2 - 7 ≤ X025 ≤ 8 → 匹配
[7, 9)区间 → 赋值3
方法3:逐行loc赋值 无需额外依赖
不想导入numpy的话可以直接用pandas的loc定位赋值,逻辑简单易读:
# 先把所有值默认设为X025<1对应的4 df['edu_level'] = 4 # 再按条件覆盖对应取值 df.loc[df['X025'].isin([1, 2]), 'edu_level'] = 1 df.loc[df['X025'].isin([3, 4, 5, 6]), 'edu_level'] = 2 df.loc[df['X025'].isin([7, 8]), 'edu_level'] = 3
校验建议
重编码完成后建议执行以下代码校验结果,避免规则写错:
# 查看新字段各取值的样本量 print(df['edu_level'].value_counts().sort_index()) # 交叉核对原字段和新字段的映射关系 print(pd.crosstab(df['X025'], df['edu_level']))
内容的提问来源于stack exchange,提问作者Korkut
相关产品推荐
相关产品推荐

