Pandas实操:如何将列转换为独热编码的数值列
问题描述
原始Pandas DataFrame(filename已设为索引)结构如下:
category1 category2 ... category6 category7 filename ... 0.wav 5 1.0 ... NaN NaN 1.wav 8 1.0 ... NaN NaN 2.wav 5 1.0 ... NaN NaN
需求:将category1至category7列中的0-12数值(忽略NaN)作为新列名,对每行进行独热编码——即该行存在的数值对应的列设为1,其余列设为0,最终目标结构如下:
0 1 2 ... 5 ... 12 filename 0.wav 0 1 0 ... 1 ... 0 1.wav 0 1 0 ... 0 ... 0 2.wav 0 1 0 ... 1 ... 0
此前尝试使用pandas.get_dummies并将数值转为字符串,但无法调整到目标结构。
解决方案
可以通过宽转长格式处理+分组统计+列补全的步骤实现,具体代码如下:
import pandas as pd # 假设你的原始DataFrame名为df # 1. 将宽格式的category列转为长格式,过滤掉NaN值 melted_df = df.reset_index().melt( id_vars='filename', value_vars=[f'category{i}' for i in range(1, 8)], value_name='code' ) melted_df = melted_df.dropna(subset=['code']) melted_df['code'] = melted_df['code'].astype(int) # 转为整数类型,保证列名是整数 # 2. 分组统计生成独热编码矩阵 one_hot_df = melted_df.groupby(['filename', 'code']).size().unstack(fill_value=0) # 3. 补全0-12的所有目标列,缺失列填充0 target_codes = list(range(0, 13)) one_hot_df = one_hot_df.reindex(columns=target_codes, fill_value=0) # 输出结果即为目标结构 print(one_hot_df)
关键步骤说明
melt:把多列category数据转为每行对应一个filename和一个有效编码的长格式,方便后续处理dropna+类型转换:清理无效的NaN值,确保编码为整数类型,避免列名出现小数或字符串groupby+unstack:通过分组计数实现独热编码,同一个filename下出现过的编码列设为1,未出现的设为0reindex:强制补全0到12的所有列,避免因某些编码未出现导致列缺失的问题
内容的提问来源于stack exchange,提问作者Compil3
相关产品推荐
相关产品推荐

