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

如何在Pandas中反转get_dummies编码,提取行中值为1的列名

解决Pandas宽表转长表:提取值为1的列名对应ID

嘿,我来帮你搞定这个Pandas数据格式转换的需求!你需要把每行中值为1的列名和对应的ID配对,生成一个长格式的DataFrame,下面是两种简单高效的实现方法:

方法一:使用melt函数(直观易懂)

melt是Pandas专门用来将宽表转为长表的工具,步骤清晰,适合新手理解:

  1. 首先构造原始DataFrame(还原你提供的数据源):
import pandas as pd

# 构建原始数据
raw_data = {
    'ID': [1002, 1003, 1004, 1005, 1006, 1007, 1000, 1009],
    '1': [0, 0, 1, 0, 0, 1, 0, 0],
    '2': [1, 0, 1, 0, 0, 0, 0, 0],
    '3': [0, 0, 0, 0, 0, 1, 0, 1],
    '4': [1, 0, 0, 0, 0, 0, 0, 0],
    '5': [0, 0, 0, 1, 0, 0, 0, 0],
    '6': [0, 0, 0, 0, 1, 0, 0, 0],
    '7': [0, 0, 0, 0, 0, 0, 0, 1],
    '8': [0, 0, 0, 0, 0, 0, 0, 0],
    '9': [0, 0, 0, 0, 0, 0, 0, 0]
}
df = pd.DataFrame(raw_data)
  1. 用melt转换格式并过滤值为1的行:
# 将宽表转为长表,ID作为标识列,其他列转为变量和值
melted_df = df.melt(id_vars='ID', var_name='Col2', value_name='flag')
# 只保留flag为1的行,删除多余的flag列并重置索引
final_df = melted_df[melted_df['flag'] == 1].drop('flag', axis=1).reset_index(drop=True)

方法二:使用stack函数(更简洁)

stack可以快速将列索引转为行索引,适合追求代码简洁的场景:

# 设置ID为索引,将其他列堆叠为行
stacked_df = df.set_index('ID').stack().reset_index()
# 重命名列名,过滤值为1的行并整理格式
stacked_df.columns = ['ID', 'Col2', 'flag']
final_df = stacked_df[stacked_df['flag'] == 1].drop('flag', axis=1).reset_index(drop=True)

最终结果

运行上述代码后,final_df就会得到你想要的格式:

ID Col2
0   1002    2
1   1002    4
2   1004    1
3   1004    2
4   1005    5
5   1006    6
6   1007    1
7   1007    3
8   1009    3
9   1009    7

注意:原始数据中ID为1003和1000的行全是0,所以不会出现在最终结果里,完全符合你的示例要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:19:52