如何用Scikit-learn和Pandas将编码列拼接至原始DataFrame
嘿,作为新手能想到用编码处理文本数据已经很棒啦!我来一步步教你怎么把编码后的列拼回原始DataFrame,分LabelEncoder和OneHotEncoder两种情况给你讲清楚~
一、用LabelEncoder编码并拼接
LabelEncoder会把每个类别映射成一个整数,适合有序分类变量(比如成绩:差、中、优)。步骤如下:
1. 导入需要的库
import pandas as pd from sklearn.preprocessing import LabelEncoder
2. 读取你的CSV文件
df = pd.read_csv('你的文件路径.csv') # 替换成你的实际文件路径
3. 找出所有object类型的列
object_cols = df.select_dtypes(include=['object']).columns
4. 编码并拼接列
循环处理每个object列,生成编码后的新列并添加到原DataFrame中:
le = LabelEncoder() for col in object_cols: # 给编码列起个新名字,比如原列名+_encoded df[f"{col}_encoded"] = le.fit_transform(df[col])
执行完后,原DataFrame里就会多出每个object列对应的编码列,原列会被保留。如果想直接替换原列,把代码改成df[col] = le.fit_transform(df[col])即可。
二、用OneHotEncoder编码并拼接
OneHotEncoder会把每个类别拆成单独的二进制列,适合无序分类变量(比如颜色:红、蓝、绿),避免模型误以为类别有顺序关系。
1. 导入库
import pandas as pd from sklearn.preprocessing import OneHotEncoder
2. 编码并拼接
# 初始化OneHotEncoder,sparse_output=False让输出是数组(方便转DataFrame),drop='first'可选(避免多重共线性) ohe = OneHotEncoder(sparse_output=False, drop='first') # 对所有object列进行编码 encoded_data = ohe.fit_transform(df[object_cols]) # 获取编码后的列名(比如原列是"color",会生成"color_red"、"color_blue"这类名字) encoded_col_names = ohe.get_feature_names_out(object_cols) # 把编码结果转成DataFrame,要和原df保持相同的索引 encoded_df = pd.DataFrame(encoded_data, columns=encoded_col_names, index=df.index) # 拼接原df和编码后的df final_df = pd.concat([df, encoded_df], axis=1) # 如果想删除原object列,可加这行: # final_df = final_df.drop(object_cols, axis=1)
三、更简洁的方法:用ColumnTransformer一步到位
如果你不想手动拆分、编码、拼接,ColumnTransformer可以帮你一次性处理所有列(指定哪些列编码,哪些列保留原样),新手用这个不容易出错:
import pandas as pd from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder # 定义转换器规则:对object列用OneHotEncoder,其他列直接保留 ct = ColumnTransformer( transformers=[ ('onehot', OneHotEncoder(sparse_output=False, drop='first'), object_cols) ], remainder='passthrough' # 保留非object类型的原列 ) # 执行转换,得到处理后的数组 transformed_data = ct.fit_transform(df) # 获取所有列名(编码列+原非object列) all_col_names = ct.get_feature_names_out() # 转成最终的DataFrame final_df = pd.DataFrame(transformed_data, columns=all_col_names)
新手注意点
- 处理前先检查数据是否有缺失值:
LabelEncoder和OneHotEncoder都不能处理缺失值,需要先填充(比如df.fillna('未知', inplace=True))或删除缺失行。 - 根据变量类型选编码方式:有序变量用
LabelEncoder,无序变量用OneHotEncoder,别搞混啦~
内容的提问来源于stack exchange,提问作者moirK
相关产品推荐
相关产品推荐

