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

如何转换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:01:28