如何拆分Pandas DataFrame列中的两位数编码为新有序变量?
拆分并重新编码整合维度数据的方法
一、拆分编码为十位(财富等级)和个位(人生阶段)
先把原编码列拆成两个数值列,同时处理特殊值-1:
import pandas as pd import numpy as np # 假设原数据列名为'combined_code' # 拆分财富等级(十位) df['wealth_code'] = np.where(df['combined_code'] == -1, -1, df['combined_code'] // 10) # 拆分人生阶段(个位) df['life_stage_code'] = np.where(df['combined_code'] == -1, -1, df['combined_code'] % 10)
二、映射为文本标签并设置为有序变量
1. 定义映射字典
# 财富等级映射 wealth_mapping = { -1: '未知', 1: '富裕家庭', 2: '富足家庭', 3: '小康家庭', 4: '低收入家庭', 5: '贫困家庭' } # 人生阶段映射 life_stage_mapping = { -1: '未知', 1: '未婚情侣及单身人士', 2: '有子女的年轻夫妇', 3: '有学龄儿童的家庭', 4: '年长家庭及成熟夫妇', 5: '退休老人' }
2. 映射并转为有序类别
因为是有序变量,必须指定逻辑顺序,确保后续排序、统计分析符合业务逻辑:
# 映射标签 df['wealth_level'] = df['wealth_code'].map(wealth_mapping) df['life_stage'] = df['life_stage_code'].map(life_stage_mapping) # 设置为有序类别 df['wealth_level'] = pd.Categorical( df['wealth_level'], categories=['未知', '贫困家庭', '低收入家庭', '小康家庭', '富足家庭', '富裕家庭'], ordered=True ) df['life_stage'] = pd.Categorical( df['life_stage'], categories=['未知', '未婚情侣及单身人士', '有子女的年轻夫妇', '有学龄儿童的家庭', '年长家庭及成熟夫妇', '退休老人'], ordered=True )
三、简化版(一步拆分+映射)
如果不需要保留中间数值编码列,可直接用字符串处理(适配编码为两位数或-1的场景):
# 将编码转为字符串方便拆分 df['code_str'] = df['combined_code'].astype(str) # 拆分并映射标签 df['wealth_level'] = df['code_str'].apply(lambda x: wealth_mapping[int(x[0])] if x != '-1' else '未知') df['life_stage'] = df['code_str'].apply(lambda x: life_stage_mapping[int(x[1])] if x != '-1' else '未知') # 转为有序类别(代码同上)
关于你之前尝试方法的问题
你用.map()时逐个枚举所有编码,不仅繁琐,而且只完成了单维度的映射,没有分离出人生阶段信息。上面的方法通过拆分十位/个位,只需要维护两个简洁的映射字典,逻辑清晰且易维护。
内容的提问来源于stack exchange,提问作者tmeyer
相关产品推荐
相关产品推荐

