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

使用melt与pivot转置指定列时如何保留全部信息?

解决DataFrame列值互换时丢失信息的问题

我明白你遇到的困扰了——用melt+pivot组合处理时,因为同一分组下存在多个对应值,默认的聚合函数只会保留第一个,导致部分数据丢失。要解决这个问题,核心是给每个需要保留的独立条目添加分组内的序号,让pivot操作能识别出这些是不同的行,不会合并它们。

具体步骤和代码实现

先看我们的原始数据:

import pandas as pd

df = pd.DataFrame({
    'id': [0,1,2,3],
    'Gender': ['M','F','M','F'],
    'TV': ['Daily','Monthly','Weekly','Daily'],
    'Radio': ['Daily','Weekly','Weekly','Daily']
})

步骤1:用melt转换为长格式

这一步你原来的操作是正确的,先把宽表转成长表,把TV、Radio这类列名转为数据行:

melted = df.melt(id_vars=['id', 'Gender'], var_name='Media', value_name='Frequency')

转换后的melted长表是这样的:

idGenderMediaFrequency
0MTVDaily
1FTVMonthly
2MTVWeekly
3FTVDaily
0MRadioDaily
1FRadioWeekly
2MRadioWeekly
3FRadioDaily

步骤2:添加分组内序号

给每个(id, Gender)组合添加一个递增序号,用来区分同一组内的不同Media条目(比如同一个id+Gender下的TV和Radio):

melted['seq'] = melted.groupby(['id', 'Gender']).cumcount()

此时melted会多一列seq,同一个id+Gender下的行从0开始编号,确保每个条目都有唯一的分组标识:

idGenderMediaFrequencyseq
0MTVDaily0
0MRadioDaily1
1FTVMonthly0
1FRadioWeekly1
...............

步骤3:pivot并整理最终结果

现在把seq也加入pivot的索引,这样每个条目都会被当成独立行处理,不会被聚合合并:

pivoted = melted.pivot(index=['id', 'Gender', 'seq'], columns='Frequency', values='Media')
# 重置索引并清理多余的列和轴名称
result = pivoted.reset_index().drop(columns='seq').rename_axis(columns=None)

最终得到的result完全符合你的期望格式:

idGenderDailyMonthlyWeekly
0MTVNaNNaN
0MRadioNaNNaN
1FNaNTVRadio
2MNaNNaNTV
2MNaNNaNRadio
3FTVNaNNaN
3FRadioNaNNaN

为什么原来的方法会丢失信息?

你之前用pivot_table的aggfunc='first'时,当同一个(id, Gender, Frequency)组合下有多个对应值(比如id0的Daily同时对应TV和Radio),聚合函数只会取第一个匹配的值,自然就丢失了后面的条目。而添加seq之后,每个条目都有了唯一的(id, Gender, seq)索引,pivot时会把它们视为独立行,彻底避免了数据合并丢失的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:47:29