如何将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
相关产品推荐
相关产品推荐

