如何用Pandas将单列编码为多列?解决重复编码问题
解决Pandas中多标签Genre列的独热编码重复问题
嘿,这个问题我之前也踩过坑!拆分列后用get_dummies确实会生成一堆带前缀的重复genre列,手动遍历行设置标记又繁琐低效。其实Pandas有更优雅的方案来处理这种多标签的独热编码,下面给你两种实用方法:
方法一:直接对原列使用str.get_dummies(最优方案)
不用先拆分列,直接对原始的逗号分隔字符串列调用str.get_dummies,它会自动识别所有唯一的genre,生成无重复的独热编码列,一步到位:
import pandas as pd # 模拟你的数据 df = pd.DataFrame({ 'genres': ['Adventure,Comedy', 'Action,Adventure', 'Comedy,Drama,Action'] }) # 直接生成独热编码 genre_dummies = df['genres'].str.get_dummies(sep=',') # 把编码结果合并回原DataFrame df = pd.concat([df, genre_dummies], axis=1)
运行后你会得到Adventure、Comedy、Action、Drama这些独立列,每一行只要包含对应genre就标记为1,完美避免重复问题。
方法二:如果已经拆分了列,用melt+ pivot_table合并重复项
要是你已经把genres拆分成了多列(比如genre1、genre2、genre3),可以通过把宽格式转成长格式再聚合的方式,合并重复的genre列:
# 假设已经拆分得到多列 df_split = df['genres'].str.split(',', expand=True).rename(columns={0:'genre1', 1:'genre2', 2:'genre3'}) # 转成长格式,保留原索引 melted = df_split.melt(var_name='split_col', value_name='genre', ignore_index=False) # 去掉空值(如果拆分后有缺失的话) melted = melted.dropna(subset=['genre']) # 重新转成宽格式,统计每个genre是否存在(存在则为1) genre_dummies = melted.pivot_table( index=melted.index, columns='genre', aggfunc='size', fill_value=0 ) # 合并回原DataFrame df = pd.concat([df, genre_dummies], axis=1)
这个方法会把所有拆分列里的同一种genre合并到同一列,彻底消除前缀导致的重复问题。
总的来说,第一种方法是最推荐的,代码简洁、效率高,完全不需要额外的拆分或循环操作。
内容的提问来源于stack exchange,提问作者user3736114




