You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中如何将DataFrame多选项列转换为0/1标记的真假表?

解决方案:将多分类列转换为0/1标记的哑变量表

先明确示例场景,方便对照理解:

示例输入DataFrame

import pandas as pd
df = pd.DataFrame({
    'Thing1': ['A', 'B', 'C', 'A'],
    'Thing2': ['X', 'Y', 'X', 'Z'],
    'OtherCol': [10, 20, 30, 40]
})

目标输出(0/1标记表)

OtherCol  Thing1_A  Thing1_B  Thing1_C  Thing2_X  Thing2_Y  Thing2_Z
0        10         1         0         0         1         0         0
1        20         0         1         0         0         1         0
2        30         0         0         1         1         0         0
3        40         1         0         0         0         0         1

方法一:利用你创建的映射DataFrame实现

假设你的映射表结构如下(包含新列名、原列名、匹配值):

mapping_df = pd.DataFrame({
    'new_col': ['Thing1_A', 'Thing1_B', 'Thing1_C', 'Thing2_X', 'Thing2_Y', 'Thing2_Z'],
    'original_col': ['Thing1', 'Thing1', 'Thing1', 'Thing2', 'Thing2', 'Thing2'],
    'match_value': ['A', 'B', 'C', 'X', 'Y', 'Z']
})

直接通过遍历映射表生成对应列即可:

# 保留原始非分类列(根据实际情况调整要保留的列)
result_df = df.drop(columns=['Thing1', 'Thing2']).copy()

# 遍历映射表,逐行生成0/1标记列
for _, row in mapping_df.iterrows():
    new_col = row['new_col']
    original_col = row['original_col']
    match_val = row['match_value']
    # 布尔判断转整数(True→1,False→0)
    result_df[new_col] = (df[original_col] == match_val).astype(int)

如果是超大型DataFrame,循环iterrows效率偏低,可以用向量化优化:

# 将映射表转为字典格式:{原列名: {匹配值: 新列名}}
mapping_dict = mapping_df.groupby('original_col').apply(
    lambda x: dict(zip(x['match_value'], x['new_col']))
).to_dict()

# 批量生成哑变量列
dummies_list = []
for col, val_col_map in mapping_dict.items():
    temp = df[col].map(val_col_map).str.get_dummies()
    dummies_list.append(temp)

# 合并所有结果
result_df = pd.concat([df.drop(columns=mapping_dict.keys()), *dummies_list], axis=1)

方法二:用pandas内置工具快速实现(无需手动维护映射表)

如果不需要自定义映射规则,pd.get_dummies可以自动识别分类列的所有可选值,一键生成目标表,效率更高:

# 对指定分类列生成哑变量,指定前缀和分隔符
dummies = pd.get_dummies(
    df[['Thing1', 'Thing2']], 
    prefix=['Thing1', 'Thing2'], 
    prefix_sep='_'
)

# 合并原始非分类列和生成的哑变量列
result_df = pd.concat([df.drop(columns=['Thing1', 'Thing2']), dummies], axis=1)

额外参数说明

  • 若分类列存在NaN值,想要把NaN也作为一个独立选项,添加参数dummy_na=True
  • 若只需要保留部分可选值(而非全部4个),则用方法一更灵活,只需在映射表中列出需要的选项即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:06:33