合并多索引DataFrame并按索引组织的技术求助
问题:合并多车辆类别DataFrame并保留分层列索引
我需要合并来自不同Excel工作表的多个DataFrame,每个DataFrame对应一类车辆,示例数据如下:
In [28]: df_Cars_&_Light_Goods.head() Out[28]: Eastbound Northbound Southbound Left Thru Right U-Turn Thru Right U-Turn Left Thru Start Time 07:00 0 0 0 0 475 17 0 43 761 07:15 0 0 0 0 558 19 1 43 834 07:30 0 0 0 0 577 28 0 37 833 In [32]: df_Buses.head() Out[32]: Eastbound Northbound Southbound Left Thru Right U-Turn Thru Right U-Turn Left Thru Start Time 07:00 0 0 0 0 24 1 0 0 14 07:15 0 0 0 0 14 2 0 2 13 07:30 0 0 0 0 35 2 0 0 18
我先通过df = df.set_index(df.columns[0], drop = True)将第一列设为时间戳索引,然后用以下代码拼接:
df_comb = pd.concat([df_tcc[key] for key in keys], ignore_index=True, axis= 1, keys= keys).sort_index(axis = 1)
其中keys是所有DataFrame名称的列表(如df_Buses、df_Cars_&_Light_Goods等)。
但拼接后得到的结果混乱,原本的多索引列标签丢失,变成了简单编号,而我期望得到车辆类别→方向→转向类型的分层列结构。
解决方案
问题核心是pd.concat的参数设置错误:
- 移除
ignore_index=True:这个参数会强制重置列的原有索引,直接导致原有的多列层级标签丢失。 - 确认所有DataFrame的行索引完全对齐(你的时间戳索引已经设置正确,这一步无需调整)。
修改后的拼接代码:
df_comb = pd.concat([df_tcc[key] for key in keys], axis=1, keys=keys).sort_index(axis=1)
执行后会得到三层列索引:
- 第一层:车辆类别(如
df_Buses、df_Cars_&_Light_Goods) - 第二层:行驶方向(如
Eastbound、Northbound) - 第三层:转向类型(如
Left、Thru、Right)
如果需要调整层级顺序(比如把方向放在最上层),可以用reorder_levels:
df_comb = df_comb.reorder_levels([1,2,0], axis=1).sort_index(axis=1)
另外,建议给keys设置更友好的名称(代替DataFrame变量名),提升索引可读性:
friendly_keys = ["Buses", "Cars & Light Goods"] df_comb = pd.concat([df_tcc[key] for key in keys], axis=1, keys=friendly_keys).sort_index(axis=1)
内容的提问来源于stack exchange,提问作者Ace_1918
相关产品推荐
相关产品推荐

