如何在Python中存储pandas的get_dummies转换以复用至其他数据集?
如何保存pandas get_dummies的转换逻辑并复用?
没问题,这是处理分类变量时非常常见的需求——当你用pd.get_dummies()把分类变量转成哑变量后,肯定希望能把这份“类别到哑变量的映射逻辑”保存下来,这样哪怕后续的数据集里类别更少,也能生成和原数据结构完全一致的哑变量矩阵(缺失的类别列会自动填充0)。下面给你两种实用的实现方式:
方法一:用pd.Categorical预先锁定类别
这种方法适合纯pandas的工作流,核心思路是先从原始数据中提取所有类别并保存,后续处理新数据时,强制把变量转换成指定类别的分类类型,再用get_dummies生成哑变量。
代码示例:
import pandas as pd # 1. 原始数据集(包含所有可能的类别) df_original = pd.DataFrame({'category': ['A', 'B', 'C', 'A', 'B']}) # 2. 提取并保存原始数据的所有类别(可以按需排序) original_categories = df_original['category'].unique().tolist() # 如果原始列已经是分类类型,也可以用 df_original['category'].cat.categories # 3. 后续待处理的新数据集(类别更少) df_new = pd.DataFrame({'category': ['A', 'C', 'C']}) # 4. 将新数据的列转换为指定类别的Categorical类型 df_new['category'] = pd.Categorical(df_new['category'], categories=original_categories) # 5. 生成哑变量,此时会包含所有原始类别对应的列 dummies_new = pd.get_dummies(df_new['category']) print(dummies_new)
运行后你会看到,新数据里没有的B列会全部填充0,完美匹配原始哑变量的维度和列顺序。
方法二:用sklearn的OneHotEncoder(更适合机器学习场景)
如果你是在机器学习流水线中处理数据,推荐用sklearn的OneHotEncoder——它可以直接保存整个编码器对象,后续加载后就能直接复用转换逻辑,还能灵活处理未知类别。
代码示例:
from sklearn.preprocessing import OneHotEncoder import pandas as pd import joblib # 1. 原始数据集 df_original = pd.DataFrame({'category': ['A', 'B', 'C', 'A', 'B']}) # 2. 初始化编码器:sparse_output=False输出密集矩阵,handle_unknown='ignore'忽略未知类别 encoder = OneHotEncoder(sparse_output=False, handle_unknown='ignore') # 拟合原始数据,学习所有类别映射 encoder.fit(df_original[['category']]) # 3. 保存编码器到本地(用joblib比pickle更适合sklearn对象) joblib.dump(encoder, 'category_encoder.pkl') # ---------------------- 后续复用阶段 ---------------------- # 4. 加载保存的编码器 loaded_encoder = joblib.load('category_encoder.pkl') # 5. 处理新数据集 df_new = pd.DataFrame({'category': ['A', 'C', 'C']}) # 转换为哑变量矩阵 dummies_array = loaded_encoder.transform(df_new[['category']]) # 6. 转换为DataFrame(用get_feature_names_out()获取列名) dummies_df = pd.DataFrame(dummies_array, columns=loaded_encoder.get_feature_names_out()) print(dummies_df)
这个方法的优势在于:编码器可以持久化存储,适合生产环境;handle_unknown='ignore'参数还能应对新数据出现原始没有的类别(此时对应列全为0),容错性更强。
额外注意点
- 用
pd.Categorical时,要确保原始类别和新数据的类别顺序完全一致,否则哑变量列的顺序会混乱 - 用
OneHotEncoder时,输入必须是二维数组(所以要用df[['category']]而不是df['category']) - 持久化编码器时,优先用
joblib,它对sklearn的大型对象序列化效率更高
内容的提问来源于stack exchange,提问作者lmocsi
相关产品推荐
相关产品推荐

