在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
相关产品推荐
相关产品推荐

