如何按分隔符拆分DataFrame字符列并生成二进制衍生列?
实现DataFrame多类别列的二进制独热编码(带前缀)
问题说明
我有一个名为df_cat的DataFrame,结构如下:
dput(df_cat) structure(list(Name = c("Name1", "Name2", "Name3", "Name4", "Name5", "Name6"), Category = c("App", "App, Comms_2", "App, Comms, Tech", "App, Tech", "Comms, Tech", "BS, Tech")), class = "data.frame", row.names = c(NA, -6L))
需要以英文逗号(含后续空格)为分隔符拆分Category列,为每个类别生成带Category_前缀的二进制新列——1表示该行包含对应类别,0表示不包含,期望输出如下:
Name Category_App Category_Comms_2 Category_Tech Category_BS Name1 1 0 0 0 Name2 1 1 0 0 Name3 1 1 1 0 Name4 1 0 1 0 Name5 0 1 1 0 Name6 0 0 1 1
如何在包含2.3万行、100余种类别的数据集中高效完成这个操作?
R语言解决方案
方法1:用tidyverse工具链(易读且高效)
针对2.3万行的规模,tidyverse的处理速度完全够用,步骤清晰:
- 拆分
Category列为多行,同时保留每行的Name - 标记每个存在的类别为1
- 转换回宽格式,缺失的类别自动填充0
- 给所有类别列加上
Category_前缀
代码示例:
library(tidyverse) df_result <- df_cat %>% separate_rows(Category, sep = ",\\s*") %>% # 拆分时自动去除类别后的空格 mutate(flag = 1) %>% pivot_wider(names_from = Category, values_from = flag, values_fill = 0) %>% rename_with(~paste0("Category_", .), -Name) # 仅重命名非Name的列 print(df_result)
方法2:用fastDummies包(性能更优)
如果追求更快的处理速度,fastDummies包的dummy_cols函数可以直接处理带分隔符的列,代码更简洁:
library(fastDummies) # 先清理Category列的空格(避免生成带空格的列名) df_cat$Category <- gsub("\\s+", "", df_cat$Category) df_result <- dummy_cols(df_cat, select_columns = "Category", split = ",", remove_selected_columns = TRUE, # 移除原Category列 prefix = "Category_") # 指定前缀 print(df_result)
Python语言解决方案(跨语言需求)
如果用Python处理,pandas的str.get_dummies可以直接实现拆分和编码:
import pandas as pd # 构造示例数据 df_cat = pd.DataFrame({ "Name": ["Name1", "Name2", "Name3", "Name4", "Name5", "Name6"], "Category": ["App", "App, Comms_2", "App, Comms, Tech", "App, Tech", "Comms, Tech", "BS, Tech"] }) # 拆分生成独热编码,并添加前缀 category_dummies = df_cat["Category"].str.get_dummies(sep=", ").add_prefix("Category_") # 合并原数据的Name列和编码结果 df_result = pd.concat([df_cat[["Name"]], category_dummies], axis=1) print(df_result)
内容的提问来源于stack exchange,提问作者Soph2010
相关产品推荐
相关产品推荐

