如何将两个单索引DataFrame按行合并为多级索引DataFrame?
更优的两级索引DataFrame构建方案
当然有更简洁高效的实现方式!你当前的方法需要先构建宽表再转长表,其实可以直接利用Pandas的MultiIndex.from_product一步生成两级索引,再构造DataFrame,完全跳过中间的melt步骤。
先还原你的原始实现(方便对比)
假设你的两个单索引DataFrame分别是df_days(行索引为日期)和df_bus(行索引为公交线路),原始代码大概是这样:
import pandas as pd # 示例单索引DataFrame df_days = pd.DataFrame(index=['周一', '周二', '周三']) df_bus = pd.DataFrame(index=['公交1', '公交2']) # 原始繁琐步骤:先建宽表 → melt转长表 → 设置多级索引 wide_df = pd.DataFrame(60, index=df_days.index, columns=df_bus.index) melted_df = wide_df.reset_index().melt(id_vars='index', var_name='Bus', value_name='Duration') final_df = melted_df.set_index(['index', 'Bus']).rename_axis(['Days', 'Bus'])
更优的实现方案
直接通过MultiIndex.from_product生成日期和公交线路的笛卡尔积索引,再直接构造DataFrame:
import pandas as pd # 同样的示例单索引DataFrame df_days = pd.DataFrame(index=['周一', '周二', '周三']) df_bus = pd.DataFrame(index=['公交1', '公交2']) # 一步生成两级索引并构造DataFrame multi_index = pd.MultiIndex.from_product( [df_days.index, df_bus.index], # 传入两个索引的标签,生成笛卡尔积 names=['Days', 'Bus'] # 指定两级索引的名称 ) final_df = pd.DataFrame({'Duration': 60}, index=multi_index)
为什么这个方案更好?
- 代码更简洁:省去了宽表创建和
melt转换的冗余步骤,逻辑更直接。 - 效率更高:避免了宽表的内存占用(尤其是当日期或公交线路数量较多时,宽表的中间环节会额外消耗内存)。
- 可读性更强:直接明确表达了“基于两个索引的笛卡尔积生成多级索引”的意图,维护起来更轻松。
如果你的两个原始DataFrame除了索引还有其他数据需要整合,也可以基于这个思路扩展,比如用merge结合cross方法(Pandas 1.2.0+支持),但如果只是生成固定值的多级索引表,上面的方法是最优解。
内容的提问来源于stack exchange,提问作者Chang
相关产品推荐
相关产品推荐

