如何将DataFrame的分层列名转换为索引并调整数据结构?
解决方法
你可以通过Pandas的reset_index、melt和pivot方法组合实现这个转换,具体操作如下:
1. 模拟原始DataFrame(如果已有数据可跳过)
import pandas as pd # 构造和你结构一致的示例数据 data = { ('Rotterdam', 'HSFO'): [453.318, 448.266], ('Singapore', 'HSFO'): [461.028, 454.016], ('Rotterdam', 'MGO'): [723.833, 735.000], ('Singapore', 'MGO'): [734.0485, 738.74945], ('Rotterdam', 'VLSFO'): [518.098, 513.596], ('Singapore', 'VLSFO'): [553.426, 549.716] } df = pd.DataFrame(data, index=['Jul 23', 'Aug 23']) df.index.name = 'period' df.columns.names = ['Bunker Port', 'bunker']
2. 执行格式转换
# 把period索引转为普通列 df_reset = df.reset_index() # 将多级列拆分为长格式数据,提取港口、燃料类型和对应数值 melted = df_reset.melt(id_vars='period', var_name=['Bunker Port', 'bunker'], value_name='value') # 透视转换,将燃料类型转为列,period和港口作为行 result = melted.pivot(index=['period', 'Bunker Port'], columns='bunker', values='value').reset_index() # 调整列顺序匹配目标结构 result = result[['period', 'Bunker Port', 'HSFO', 'MGO', 'VLSFO']] # 设置多级列标题,和目标格式完全对齐 result.columns = pd.MultiIndex.from_tuples( [('', 'period'), ('', 'Bunker Port'), ('bunker', 'HSFO'), ('bunker', 'MGO'), ('bunker', 'VLSFO')] ) # 查看最终结果 print(result)
执行后得到的结构和你需求完全一致,自动生成的0-4索引可通过result = result.set_index([('', 'period'), ('', 'Bunker Port')])移除。
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

