You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:53:48