Label Encoder后执行One Hot Encoder报错:Expected 2D array, got 1D array instead
解决OneHotEncoder报错:Expected 2D array, got 1D array instead
嘿,这个问题我太熟悉了!Sklearn的OneHotEncoder对输入维度有严格要求——它必须接收2维数组,但你直接传入的df['info.venue']是1维的Pandas Series,这就是触发错误的核心原因。哪怕你已经用LabelEncoder做过编码,输出的依然是1维数据,所以还是会踩这个坑。
给你几个简单可行的解决方案:
方法1:把1维Series转成2维数组
用values.reshape(-1, 1)把Series转换成符合要求的2D格式:
from sklearn.preprocessing import OneHotEncoder onehotencoder = OneHotEncoder() # 用reshape把1D转成2D var1 = onehotencoder.fit_transform(df['info.venue'].values.reshape(-1, 1))
方法2:传入DataFrame而非Series
直接用双层方括号df[['info.venue']]提取列,这样得到的是一个只有1列的DataFrame(天然是2维结构):
var1 = onehotencoder.fit_transform(df[['info.venue']])
方法3:用Pandas的get_dummies更省心
如果你不需要严格用Sklearn的编码器,Pandas的get_dummies可以一步完成独热编码,还能自动处理列名,非常方便:
import pandas as pd # 生成独热编码列,前缀设为venue方便识别 venue_onehot = pd.get_dummies(df['info.venue'], prefix='venue') # 把编码后的列合并回原DataFrame df = pd.concat([df, venue_onehot], axis=1)
如果之后要和Sklearn的Pipeline配合使用,推荐用ColumnTransformer来指定要编码的列,这样能彻底避免维度问题,比如:
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder # 定义转换器:对info.venue列做独热编码 ct = ColumnTransformer( transformers=[('encoder', OneHotEncoder(), ['info.venue'])], remainder='passthrough' ) # 应用转换器,输出的是2D数组 df_encoded = ct.fit_transform(df)
内容的提问来源于stack exchange,提问作者Mayur Mahajan
相关产品推荐
相关产品推荐

