如何合并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
相关产品推荐
相关产品推荐

