跨列循环选择数据子集生成新变量及多值字符串转1/0编码列最优方法咨询
我来帮你搞定这个问题!处理这类来自select_multiple的多值字符串列生成0/1编码,不管用Python还是R都有很高效的方案,还能轻松实现批量循环处理多列的需求,下面给你详细拆解:
Python(Pandas)实现方案
1. 单列生成0/1编码列
针对skin_problems这类空格分隔的多值字符串列,Pandas的str.get_dummies方法可以直接搞定,一步生成对应编码:
import pandas as pd # 模拟你的数据 df = pd.DataFrame({ 'skin_problems': ['1 3 5', '2', '4 5 10', '', '1'] }) # 拆分字符串并生成0/1编码列 dummy_cols = df['skin_problems'].str.get_dummies(sep=' ') # 把编码列合并回原数据集 df = pd.concat([df, dummy_cols], axis=1)
如果你的数值范围是固定的(比如1到10),可以强制生成所有可能的列,避免因部分数值未出现而缺失:
# 指定所有可能的取值(1到10) all_vals = [str(i) for i in range(1, 11)] dummy_cols = df['skin_problems'].str.get_dummies(sep=' ') # 补充缺失的列并填充0 for val in all_vals: if val not in dummy_cols.columns: dummy_cols[val] = 0 # 按数值顺序排列列 dummy_cols = dummy_cols[all_vals] df = pd.concat([df, dummy_cols], axis=1)
2. 循环批量处理多列
如果有多个类似的多值列(比如allergies、symptoms),写个循环就能批量生成编码:
# 定义需要处理的多值列列表 multi_value_cols = ['skin_problems', 'allergies', 'symptoms'] for col in multi_value_cols: # 生成当前列的编码列 dummies = df[col].str.get_dummies(sep=' ') # 给编码列加前缀,避免列名冲突 dummies.columns = [f"{col}_{val}" for val in dummies.columns] # 合并回原数据集 df = pd.concat([df, dummies], axis=1)
R语言实现方案
1. 单列生成0/1编码列
用tidyverse工具链可以快速完成拆分转宽的操作,或者用fastDummies包一键生成:
方法一:tidyverse原生实现
library(tidyverse) # 模拟数据 df <- tibble( skin_problems = c("1 3 5", "2", "4 5 10", "", "1") ) df <- df %>% # 把空格分隔的字符串拆分为多行 separate_rows(skin_problems, sep = " ") %>% # 标记存在的数值为1 mutate(value = 1) %>% # 转换为宽格式,缺失值填充0 pivot_wider(names_from = skin_problems, values_from = value, values_fill = 0) %>% # 删除空字符串生成的列(如果原数据有空白值) select(-``)
方法二:fastDummies一键生成
library(fastDummies) df <- dummy_cols(df, select_columns = "skin_problems", split = " ")
2. 循环批量处理多列
用purrr或者基础R循环都能批量处理多列:
# 定义需要处理的多值列列表 multi_value_cols <- c("skin_problems", "allergies", "symptoms") # 用purrr批量处理并合并 df <- multi_value_cols %>% map_dfr(~ dummy_cols(df, select_columns = .x, split = " ")) %>% bind_cols(df, .) %>% # 可选:删除原多值列 select(-all_of(multi_value_cols)) # 或者用基础R循环 for (col in multi_value_cols) { df <- dummy_cols(df, select_columns = col, split = " ") }
内容的提问来源于stack exchange,提问作者mmarks
相关产品推荐
相关产品推荐

