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

如何将Pandas DataFrame宽表转换为日期-价格两列格式?

Pandas宽表转长表:生成Date和Price列

方法一:用pd.melt()(直观易上手)

这是Pandas专门为宽表转长表设计的函数,逻辑清晰,适合新手:

import pandas as pd

# 读取数据,注意不要把Year设为索引(除非后续手动转回列)
df = pd.read_csv('matrix-A.csv')

# 将宽表拆解:Year作为标识列,Jan-Jun这些月份列转为"月份-价格"的行数据
melted_df = pd.melt(df, id_vars='Year', var_name='Month', value_name='Price')

# 拼接月份和年份,生成目标Date列
melted_df['Date'] = melted_df['Month'] + '-' + melted_df['Year'].astype(str)

# 只保留需要的两列并调整顺序
final_df = melted_df[['Date', 'Price']]

print(final_df)

方法二:用stack()(链式操作更简洁)

如果习惯用链式写法,stack可以快速把列索引转为行层级:

import pandas as pd

df = pd.read_csv('matrix-A.csv')

# 链式操作:设Year为索引→转列行为行→重置索引→生成Date列
final_df = (
    df.set_index('Year')
    .stack()  # 把Jan-Jun列转为行的二级索引
    .reset_index(name='Price')  # 重置索引,把二级索引转为Month列
    .rename(columns={'level_1': 'Month'})
)

# 拼接成目标Date格式
final_df['Date'] = final_df['Month'] + '-' + final_df['Year'].astype(str)

# 保留所需列
final_df = final_df[['Date', 'Price']]

print(final_df)

你之前代码的问题

你之前直接拼接Year和不存在的Dec列,既没覆盖所有月份,也没对应上每行的价格,逻辑上走不通。上面两种方法都是Pandas原生的矢量化操作,比apply/agg效率高得多,不用手动循环处理每行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:15:40