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

如何用Pandas基于三个列表创建三级MultiIndex数据框?

构建三级MultiIndex DataFrame的高效方法

嘿,我来帮你搞定这个三级索引的问题!你需要把列表A(月份)、B(地点)、C(三个DataFrame)整合成一个带三级索引的DataFrame,索引分别对应月份、地点、子DataFrame的行号(0-1),而且不想用循环来切片数据,对吧?之前用循环构建字典的方式确实会让后续操作很繁琐,咱们用pandas的原生方法就能高效解决这个问题,还能让后续切片变得非常丝滑!

先注意一个小坑

你原来定义C列表的方式[pd.DataFrame(np.random.randn(2, 3), columns=list('ABC'))]*3会生成三个指向同一个DataFrame对象的引用,修改其中一个会影响所有。建议改成列表推导式生成独立的DataFrame:

import pandas as pd
import numpy as np

A = ["Jan", "Feb", "Mar"]
B = ["location1", "location2", "location3"]
# 用列表推导式生成3个独立的DataFrame
C = [pd.DataFrame(np.random.randn(2, 3), columns=list('ABC')) for _ in range(3)]

方法一:循环给子DataFrame添加三级索引再合并

这种方式逻辑直观,适合新手理解:

dfs_with_multiindex = []
# 遍历三个列表的对应元素
for month, location, df in zip(A, B, C):
    # 给当前子DataFrame构造三级索引:(月份, 地点, 行号)
    df.index = pd.MultiIndex.from_tuples(
        [(month, location, row_idx) for row_idx in df.index],
        names=['Month', 'Location', 'Row']  # 给三级索引命名,方便后续操作
    )
    dfs_with_multiindex.append(df)

# 合并所有带索引的子DataFrame
final_df = pd.concat(dfs_with_multiindex)

方法二:用concat的keys参数快速构建(更简洁)

这种方式利用pandas的concat自带的keys参数,一步生成多级索引,再调整行索引层级:

# 用zip(A,B)生成(月份,地点)的配对作为keys,合并C中的DataFrame
temp_df = pd.concat(C, keys=list(zip(A, B)), names=['Month', 'Location'])
# 把原来的行索引(0/1)提升为第三级索引
final_df = temp_df.reset_index(level=2, name='Row').set_index('Row', append=True)

后续切片操作(无需循环!)

生成的final_df是标准的MultiIndex DataFrame,直接用pandas的索引切片语法就能快速筛选数据:

  • 筛选Jan月份的所有数据:
    final_df.loc['Jan']
    
  • 筛选location2的所有行:
    final_df.loc[(slice(None), 'location2'), :]
    
  • 筛选Feb、location1、行0的具体数据:
    final_df.loc[('Feb', 'location1', 0), :]
    
  • 甚至可以用xs方法跨层级筛选,比如筛选所有行号为1的数据:
    final_df.xs(1, level='Row')
    

内容的提问来源于stack exchange,提问作者Solomon Vimal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:35:33