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

如何用pandas.melt()实现DataFrame列与Location元素的互换?

解决DataFrame列互换问题的正确方法

步骤1:构造测试数据(模拟你的场景)

先创建并合并符合要求的3个DataFrame:

import pandas as pd

# 创建三个带Location字段的DataFrame
df_A = pd.DataFrame({'1': [10], '2': [20], '3': [30], '4': [40], 'Location': 'A'})
df_B = pd.DataFrame({'1': [15], '2': [25], '3': [35], '4': [45], 'Location': 'B'})
df_C = pd.DataFrame({'1': [12], '2': [22], '3': [32], '4': [42], 'Location': 'C'})

# 合并成cdf
cdf = pd.concat([df_A, df_B, df_C], ignore_index=True)

步骤2:两种实现列互换的方法

方法一:melt + pivot(通用且直观)

先转成长格式,再通过pivot重塑成目标宽格式:

# 转长格式,提取time、Location和对应值
melted = pd.melt(cdf, id_vars='Location', var_name='time', value_name='value')

# pivot得到目标格式:time为行,Location为列
result = melted.pivot(index='time', columns='Location', values='value').reset_index()
# 可选:移除列名的层级标签
result.columns.name = None

方法二:直接转置(更简洁)

利用索引转置一步到位:

# 将Location设为索引,转置后重置索引并重命名列
result = cdf.set_index('Location').T.reset_index().rename(columns={'index': 'time'})
# 可选:移除列名的层级标签
result.columns.name = None

最终结果示例

两种方法都会得到如下格式的DataFrame:

timeABC
1101512
2202522
3303532
4404542

为什么你之前的方法出问题?

  • 用pivot出现大量NaN:大概率是原始合并后的cdf中,某个time-Location组合存在缺失值,或者melt时未正确指定字段名导致数据匹配错误。按上面的标准构造流程,每个time对应每个Location都有唯一值,pivot不会产生NaN。
  • 用pivot_table得到聚合结果:因为pivot_table默认会对重复值做聚合(比如mean),而你的场景中没有重复的time-Location组合,完全不需要聚合,所以用pivot就足够。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:30:50