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

如何用Pandas将Dataframe逆透视?pd.melt()使用问题求解答

解决哑变量合并为单一列的问题

嘿,我懂你的困扰啦!你想把那些星期相关的哑变量列(Mon、Tu、Wed)合并成一列,直接显示每个人对应的星期,而不是用pd.melt()把数据堆得变长,对吧?下面给你两种实用的解决方案:

方法一:用idxmax()快速生成对应列(最简洁)

因为你的数据里每行在Mon/Tu/Wed中只有一个1,我们可以直接找到每行值为1的列名,一步生成目标列:

import pandas as pd

# 先把你的字典转成正确的DataFrame
df = pd.DataFrame({
    'name':['Jennifer','Vivian','Trisha'], 
    'married':[1,1,0], 
    'Mon': [0, 0,1], 
    'Tu':[1,0,0], 
    'Wed':[0,1,0]
})

# 指定要处理的哑变量列
day_columns = ['Mon', 'Tu', 'Wed']

# 生成新列:取每行值为1的列名
df['assigned_day'] = df[day_columns].idxmax(axis=1)

# 可选:如果不需要原来的哑变量列,直接删除
df = df.drop(day_columns, axis=1)

运行后你会得到这样的结果:

namemarriedassigned_day
Jennifer1Tu
Vivian1Wed
Trisha0Mon

方法二:基于pd.melt()调整(适合更复杂场景)

如果你一定要用melt,可以通过筛选值为1的行来修正“行数变长”的问题:

# 第一步:melt哑变量列,保留name和married作为标识列
melted_df = pd.melt(
    df,
    id_vars=['name', 'married'],  # 不参与堆叠的列
    value_vars=day_columns,       # 要堆叠的哑变量列
    var_name='assigned_day',      # 新列的列名(星期)
    value_name='is_selected'      # 存储原哑变量值的列名
)

# 第二步:筛选出值为1的行(也就是对应正确的星期)
final_df = melted_df[melted_df['is_selected'] == 1].drop('is_selected', axis=1)

这样final_df就和方法一的结果完全一致啦,这种方法更灵活,比如如果你的数据存在多行多个1的情况,也可以轻松调整筛选逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:46:58