如何用Pandas实现字符级拆分的空格分隔独热编码
实现字符级别的空格兼容独热编码(合并字符组合为单个字符特征)
我来帮你搞定这个需求!你现在的问题是,str.get_dummies(' ')会把空格分隔的子串(比如"ap")当成独立的特征,但你希望不管字符是分开还是连在一起的,都按单个字符来生成独热编码。下面给你两种可行的解决方案:
方法一:字符串预处理 + get_dummies
核心思路是先把所有字符串中的空格去掉,再将每个字符拆出来用空格连接,最后用get_dummies生成编码:
import pandas as pd import numpy as np # 初始化你的数据 df = pd.DataFrame(["c", "b", "a p", np.nan, "ap"]) # 处理流程:填充空值 → 移除空格 → 拆分单个字符 → 用空格连接 → 生成独热编码 result = df[0].fillna('')\ .str.replace(' ', '')\ .str.findall('.')\ .str.join(' ')\ .str.get_dummies(' ') print(result)
输出结果完全符合你的期望:
a b c p 0 0 0 1 0 1 0 1 0 0 2 1 0 0 1 3 0 0 0 0 4 1 0 0 1
步骤解释:
fillna(''):把NaN值替换为空字符串,避免后续字符串操作报错str.replace(' ', ''):移除所有空格,只保留纯字符内容str.findall('.'):匹配每个单个字符,返回字符列表(比如"ap"会变成['a','p'])str.join(' '):把字符列表用空格重新连接成字符串,让get_dummies能识别每个字符为独立类别str.get_dummies(' '):按空格分割生成独热编码,此时每个字符都是单独的特征
方法二:用explode + crosstab实现
另一种更直观的思路是把每个字符拆分成单独的行,再用交叉表统计生成编码:
import pandas as pd import numpy as np df = pd.DataFrame(["c", "b", "a p", np.nan, "ap"]) # 处理空值 → 移除空格 → 拆分字符列表 → 展开为单行单个字符 exploded_chars = df[0].fillna('')\ .str.replace(' ', '')\ .str.findall('.')\ .explode() # 用交叉表统计每个原行对应的字符出现情况,对齐原索引 result = pd.crosstab(exploded_chars.index, exploded_chars).reindex(df.index, fill_value=0) print(result)
这个方法同样能得到你想要的结果,适合需要更灵活处理字符的场景。
步骤解释:
explode():把每个字符列表拆分成单独的行,每个字符对应原数据的行索引pd.crosstab():统计每个索引(原行号)下各字符的出现次数,自动生成独热编码格式reindex(df.index, fill_value=0):对齐原数据的索引,没有字符的行填充0,保证结果行数和原数据一致
内容的提问来源于stack exchange,提问作者Kathiravan Natarajan
相关产品推荐
相关产品推荐

