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

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,未出现的设为0
  • reindex:强制补全0到12的所有列,避免因某些编码未出现导致列缺失的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:05:37