如何用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)
运行后你会得到这样的结果:
| name | married | assigned_day |
|---|---|---|
| Jennifer | 1 | Tu |
| Vivian | 1 | Wed |
| Trisha | 0 | Mon |
方法二:基于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
相关产品推荐
相关产品推荐

