You need to enable JavaScript to run this app. Python中高效基于已有变量创建新变量:pandas多值重编码方案
优惠活动
大模型
产品
解决方案
定价
更多

Python中高效基于已有变量创建新变量:pandas多值重编码方案

报错原因

之前的写法触发TypeError是两个层面的问题:

  • | 是Python的位运算操作符,字符串类型没有实现这个运算符,直接拼接写在字符串之间必然报类型错误;
  • 就算去掉运算符、把多个值写成元组当字典键,map 方法只会匹配和整个元组完全相等的单元格值,不会匹配元组内部的单个元素,根本达不到批量归类的效果。
可行方案(按改动成本从低到高排序)

方案1:用replace替代map,改动最小

Series.replace 原生支持字典键为列表的场景,列表内的所有原始值会被统一映射到对应目标值,不需要额外写拆分逻辑,是对你原有代码改动最少的实现方式。

import numpy as np
import pandas as pd

# 定义映射规则,多值归为一类时直接把所有原始值放在列表里当键
race_mapping = {
    'Black or African American': 'Black',
    'White': 'White',
    'Hispanic or Latino': 'Non-White Hispanic',
    # 亚裔组三个原始值统一映射
    ['Asian', 'Asian/Indian/Pacific Islander', 'Native Hawaiian or Other Pacific Islander']: 'Asian/Pacific Islander',
    # 多族裔组两个原始值统一映射
    ['American Indian or Alaska Native', 'Other/Mixed']: 'Multiracial/other',
    'Unspecified': np.nan
}

df['Race'] = df['Race'].replace(race_mapping)

方案2:扁平化映射字典,保留map使用习惯

如果你更熟悉map的匹配逻辑,可以先把多值映射规则拆成单值对应的扁平化字典,再调用map方法,逻辑和你之前的写法完全一致。

# 基于多值映射规则生成扁平化字典
flat_mapping = {}
for key, target in race_mapping.items():
    # 判断如果是列表形式的多值键,拆成每个元素对应同一个目标值
    if isinstance(key, list):
        for origin_val in key:
            flat_mapping[origin_val] = target
    else:
        flat_mapping[key] = target

df['Race'] = df['Race'].map(flat_mapping)

方案3:类别型重编码,大表性能最优

如果处理的是百万行级别的大表,逐行做字符串匹配的开销很高。此时可以把列转成pandas类别型,直接修改底层的类别标签映射,不需要逐行扫描单元格内容,运行速度比前两个方案快一个量级以上。

# 先把Race列转为类别型
df['Race'] = df['Race'].astype('category')

# 定义单值到新类别的映射规则
category_rename_rule = {
    'Black or African American': 'Black',
    'White': 'White',
    'Hispanic or Latino': 'Non-White Hispanic',
    'Asian': 'Asian/Pacific Islander',
    'Asian/Indian/Pacific Islander': 'Asian/Pacific Islander',
    'Native Hawaiian or Other Pacific Islander': 'Asian/Pacific Islander',
    'American Indian or Alaska Native': 'Multiracial/other',
    'Other/Mixed': 'Multiracial/other',
    'Unspecified': np.nan
}

# 直接修改类别标签,不遍历全表内容
df['Race'] = df['Race'].cat.rename_categories(category_rename_rule)
常见避坑点
  • replace和map默认是精确匹配,不会对字符串做模糊子串匹配,不用担心误匹配内容。
  • 不要用元组当多值映射的键,pandas相关方法对元组键的匹配逻辑是把整个元组作为独立值判断,无法实现批量归类。

内容的提问来源于stack exchange,提问作者JVDeasyas123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 04:15:04