如何将Pandas DataFrame重排为指定长格式(匹配对应日期)
Pandas 宽表转长表的最佳方案
你的需求是把宽格式的DataFrame转换为长格式,这里用pd.melt()是最直接高效的方法,比transpose、pivot更适配这个场景。
原数据结构
import pandas as pd data = {'date': ['1/1/2022', '1/2/2022','1/3/2022'], 'ticker1': [11, 21, 31], 'ticker2': [12, 22, 32], 'ticker3': [13, 23, 33]} df = pd.DataFrame(data)
转换代码
# 宽表转长表 melted_df = pd.melt(df, id_vars=['date'], # 保留作为标识的列 value_vars=['ticker1', 'ticker2', 'ticker3'], # 需要转换的列 var_name='ticker', # 转换后的类别列名 value_name='price') # 转换后的数值列名
转换结果
转换后的DataFrame会和你预期的逻辑一致(注:你提供的目标示例中ticker列的取值存在重复错误,正确结果应为每个date对应ticker1/ticker2/ticker3各一行):
print(melted_df) # 输出: # date ticker price # 0 1/1/2022 ticker1 11 # 1 1/2/2022 ticker1 21 # 2 1/3/2022 ticker1 31 # 3 1/1/2022 ticker2 12 # 4 1/2/2022 ticker2 22 # 5 1/3/2022 ticker2 32 # 6 1/1/2022 ticker3 13 # 7 1/2/2022 ticker3 23 # 8 1/3/2022 ticker3 33
其他方法的局限性
- transpose:只是简单交换行列,无法实现按类别拆分列的需求,转换后结构完全不符合预期。
- pivot:主要用于长表转宽表或聚合数据,是melt的反向操作,不适合当前场景。
- stack:虽然也能实现宽转长,但需要先设置索引,操作步骤更繁琐,适合处理多层列索引的情况,单层列用melt更简洁。
内容的提问来源于stack exchange,提问作者Tartaglia
相关产品推荐
相关产品推荐

