如何转换DataFrame合并两列实现独热编码及自定义sklearn转换器
解决方案
一、更简便的Pandas实现方式
方法1:独热编码结合逐列乘法
直接对Card列生成独热编码后,让每一列与Success列相乘,一步得到目标列,比手动与运算更简洁:
import pandas as pd # 示例数据 df = pd.DataFrame({ 'Index': [1, 1, 2, 2, 3, 4], 'Card': ['Visa', 'Master', 'Visa', 'Master', 'Visa', 'Master'], 'Success': [0, 1, 1, 0, 1, 1] }) # 生成独热编码并与Success列相乘,重命名列名 card_dummies = pd.get_dummies(df['Card'], prefix='Card') result = card_dummies.mul(df['Success'], axis=0) result.columns = [f"{col}_Success" for col in result.columns] # 按Index分组取最大值(同一Index对应不同Card的两行数据合并) result = result.groupby(df['Index']).max().reset_index()
方法2:用透视表直接生成目标格式
利用pivot_table一步完成分组、填充缺失值和格式转换,代码量最少:
result = df.pivot_table( index='Index', columns='Card', values='Success', fill_value=0, aggfunc='max' # 同一Index下同一Card仅一个值,max不影响结果 ).reset_index() # 重命名列名匹配需求 result.columns = ['Index', 'Card_Visa_Success', 'Card_Master_Success']
二、可集成到Sklearn Pipeline的自定义转换器
要让转换逻辑适配Sklearn Pipeline,需继承BaseEstimator和TransformerMixin,实现标准化的fit和transform方法:
from sklearn.base import BaseEstimator, TransformerMixin import pandas as pd class CardSuccessCombiner(BaseEstimator, TransformerMixin): def __init__(self, card_col='Card', success_col='Success', index_col='Index'): self.card_col = card_col self.success_col = success_col self.index_col = index_col self.card_categories = None # 存储训练阶段的Card类别,保证转换时类别一致 def fit(self, X, y=None): # 记录Card列的所有类别,避免转换时出现类别缺失或新增 self.card_categories = X[self.card_col].unique() return self def transform(self, X): # 生成透视表 result = X.pivot_table( index=self.index_col, columns=self.card_col, values=self.success_col, fill_value=0, aggfunc='max' ) # 补全训练阶段存在但当前数据缺失的Card类别,填充0 for cat in self.card_categories: if cat not in result.columns: result[cat] = 0 # 重命名列并重置索引 result.columns = [f"Card_{cat}_Success" for cat in result.columns] result = result.reset_index() return result
集成到Pipeline的示例
from sklearn.pipeline import Pipeline # 构建Pipeline pipeline = Pipeline([ ('card_success_combiner', CardSuccessCombiner()) ]) # 执行转换 transformed_df = pipeline.fit_transform(df)
内容的提问来源于stack exchange,提问作者Dhruva Ahuja
相关产品推荐
相关产品推荐

