如何用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:
| time | A | B | C |
|---|---|---|---|
| 1 | 10 | 15 | 12 |
| 2 | 20 | 25 | 22 |
| 3 | 30 | 35 | 32 |
| 4 | 40 | 45 | 42 |
为什么你之前的方法出问题?
- 用
pivot出现大量NaN:大概率是原始合并后的cdf中,某个time-Location组合存在缺失值,或者melt时未正确指定字段名导致数据匹配错误。按上面的标准构造流程,每个time对应每个Location都有唯一值,pivot不会产生NaN。 - 用
pivot_table得到聚合结果:因为pivot_table默认会对重复值做聚合(比如mean),而你的场景中没有重复的time-Location组合,完全不需要聚合,所以用pivot就足够。
内容的提问来源于stack exchange,提问作者lllIlllllIll
相关产品推荐
相关产品推荐

