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

如何合并DataFrame与哑变量且避免出现重复列?

解决方案

问题根源

你使用pd.get_dummies时传入了包含所有列的过滤后DataFrame,导致生成的结果保留了原DataFrame的非分类列(如name、salary),合并时自然会出现大量重复列。核心解决思路是:仅传入需要生成哑变量的分类列,而非整个数据集。


方法一:分批次生成哑变量后合并(匹配你的原始逻辑)

步骤1:准备数据并计算分类列Top3值

import pandas as pd
import numpy as np

# 可复现示例DataFrame
df = pd.DataFrame({
    'name': ['hacker', 'scamer', 'breaker', 'coder', 'leaker', 'tester', 'helper', 'leader'],
    'salary': [1000, 1250, 250, 1001, 2500, 1500, 500, 3000],
    'col1': ['a', 'b', 'b', 'a', 'c', 'a', 'd', 'e'],
    'col2': ['b', 'c', 'c', np.nan, 'b', 'd', np.nan, 'a']
})

# 计算col1和col2的Top3高频值
col1_top3 = df['col1'].value_counts().head(3)
col2_top3 = df['col2'].value_counts().head(3)

步骤2:生成仅含哑变量的数据集

生成时仅选择col1和col2列,避免带入其他冗余列:

# 生成col1在Top3范围内的哑变量(仅保留哑变量列)
dummies1 = pd.get_dummies(
    df.loc[df['col1'].isin(col1_top3.index), ['col1', 'col2']],
    columns=['col1', 'col2'],
    prefix=['col1', 'col2']  # 添加前缀区分同一分类值来自col1还是col2
)

# 生成col2在Top3范围内的哑变量(仅保留哑变量列)
dummies2 = pd.get_dummies(
    df.loc[df['col2'].isin(col2_top3.index), ['col1', 'col2']],
    columns=['col1', 'col2'],
    prefix=['col1', 'col2']
)

步骤3:合并哑变量并关联原DataFrame

# 合并两个哑变量集,按索引去重(同一行满足两个条件时取有效值)
combined_dummies = pd.concat([dummies1, dummies2]).groupby(level=0).max().fillna(0)

# 关联原DataFrame,得到最终结果
final_df = df.join(combined_dummies)

方法二:直接生成全量Top3哑变量(更简洁)

如果不需要分两次过滤生成,可直接对整个数据集生成仅包含Top3分类值的哑变量:

# 生成col1的Top3哑变量(不在Top3的分类值转为NaN,get_dummies会自动忽略)
col1_dummies = pd.get_dummies(df['col1'].where(df['col1'].isin(col1_top3.index)), prefix='col1')

# 生成col2的Top3哑变量
col2_dummies = pd.get_dummies(df['col2'].where(df['col2'].isin(col2_top3.index)), prefix='col2')

# 合并哑变量并关联原DataFrame
all_dummies = pd.concat([col1_dummies, col2_dummies], axis=1)
final_df = df.join(all_dummies)

最终效果

final_df将包含原DataFrame的所有列,加上col1和col2对应Top3分类值的哑变量列,无任何重复列。

内容的提问来源于stack exchange,提问作者TiimeIrre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:31:00