DataFrame替换元组形式独热向量时维度不匹配问题求助
独热编码转换维度不匹配问题解决
在进行垃圾邮件与非垃圾邮件分类的机器学习任务时,需要将邮件主题、重要性、发件人等字符串字段转换为[1,0,0]格式的独热编码向量,但替换过程中触发以下维度不匹配错误:
ValueError: operands could not be broadcast together with shapes (1000,) (6,)
自定义处理函数
def vec(u_v): y = len(u_v) x = [0] * y for j in range(y): x[j] = 1 u_v[j] = tuple(x.copy()) x = [0] * y return u_v def arrange(df): organized_df = df.copy() for i in df.columns: unique_values = df[i].unique() replacement_values = vec(unique_values) for j in range(len(unique_values)): organized_df[i] = organized_df[i].replace({unique_values[j]: replacement_values[j]}) return organized_df
期望结果
| Subject | Importance |
|---|---|
| [1,0,0] | [0,0,1] |
| [0,1,0] | [1,0,0] |
问题原因
vec函数直接修改了传入的unique_values(df[i].unique()返回的是numpy数组,属于可变对象),导致后续映射逻辑出现类型混乱- 循环调用
replace时,pandas会尝试将tuple类型的向量拆解为单个元素,触发维度广播不匹配的错误
修复方案
方案1:使用pandas内置函数(推荐)
利用get_dummies生成独热编码,再将每行转为向量格式,简洁高效:
import pandas as pd def arrange(df): organized_df = df.copy() for col in df.columns: # 生成对应列的独热编码矩阵 dummy_df = pd.get_dummies(df[col], prefix=col) # 将每行独热编码转为列表,替换原列 organized_df[col] = dummy_df.apply(list, axis=1) return organized_df
方案2:修复自定义函数
修改vec函数避免修改原数组,改用map进行值映射,避免循环替换的广播问题:
def vec(u_v): y = len(u_v) replacement_list = [] for j in range(y): x = [0] * y x[j] = 1 replacement_list.append(tuple(x)) return replacement_list def arrange(df): organized_df = df.copy() for col in df.columns: unique_values = df[col].unique() replacement_values = vec(unique_values) # 创建值到向量的映射字典 val_to_vec = dict(zip(unique_values, replacement_values)) # 用map一次性完成映射 organized_df[col] = organized_df[col].map(val_to_vec) return organized_df
内容的提问来源于stack exchange,提问作者Alex Von D
相关产品推荐
相关产品推荐

