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

如何用含列表的字典在Pandas中创建带MultiIndex的DataFrame?

用Pandas创建/转换带MultiIndex的DataFrame解决方案

没问题,我来帮你搞定这两个Pandas里的多层索引需求!下面分两种场景给你详细说明和可直接运行的代码示例:

一、用包含列表的字典创建MultiIndex DataFrame

核心思路是先定义好多层索引(MultiIndex)的结构,再确保字典里每个数据列表的长度和索引的总条目数匹配,最后结合两者生成DataFrame。

示例1:手动指定索引组合

假设我们要做一个「年份-季度」的两层索引,对应销售额和利润数据:

import pandas as pd

# 1. 构建多层索引:年份+季度的组合
year_qtr_tuples = [(2022, 'Q1'), (2022, 'Q2'), (2023, 'Q1'), (2023, 'Q2')]
multi_index = pd.MultiIndex.from_tuples(year_qtr_tuples, names=['Year', 'Quarter'])

# 2. 构造包含列表的字典,每个列表长度和索引条目数一致
data = {
    'Sales': [1000, 1200, 1500, 1600],
    'Profit': [150, 180, 220, 240]
}

# 3. 创建带多层索引的DataFrame
df = pd.DataFrame(data, index=multi_index)
print(df)

运行后输出:

Sales  Profit
Year Quarter              
2022 Q1       1000     150
     Q2       1200     180
2023 Q1       1500     220
     Q2       1600     240

示例2:自动生成索引组合(适合层级是笛卡尔积的情况)

如果你的索引层级是「所有年份 × 所有季度」这种全组合,可以用from_product更高效:

import pandas as pd

# 自动生成年份和季度的所有组合作为多层索引
multi_index = pd.MultiIndex.from_product(
    [[2022, 2023], ['Q1', 'Q2']],
    names=['Year', 'Quarter']
)

data = {
    'Sales': [1000, 1200, 1500, 1600],
    'Profit': [150, 180, 220, 240]
}

df = pd.DataFrame(data, index=multi_index)

得到的结果和上面完全一致。

二、将现有字典转换为MultiIndex DataFrame

这里我假设你的现有字典是嵌套结构(最常见的场景),比如形如{外层索引: {内层索引: {列名: 值}}},举个具体例子来演示转换方法:

示例:嵌套字典转MultiIndex DataFrame

假设你有这样的现有字典:

existing_dict = {
    2022: {'Q1': {'Sales': 1000, 'Profit': 150}, 'Q2': {'Sales': 1200, 'Profit': 180}},
    2023: {'Q1': {'Sales': 1500, 'Profit': 220}, 'Q2': {'Sales': 1600, 'Profit': 240}}
}

我们可以先把嵌套字典展开成「(外层索引, 内层索引): 列值字典」的结构,再转成DataFrame并设置多层索引:

import pandas as pd

# 1. 展开嵌套字典为扁平的元组键字典
flattened_dict = {
    (year, qtr): metrics 
    for year, quarters in existing_dict.items() 
    for qtr, metrics in quarters.items()
}

# 2. 转换为DataFrame,同时把元组键转成MultiIndex
df = pd.DataFrame.from_dict(flattened_dict, orient='index')
df.index = pd.MultiIndex.from_tuples(df.index, names=['Year', 'Quarter'])

print(df)

运行后同样会得到和前面一致的多层索引DataFrame。

如果你的现有字典结构不一样(比如列表嵌套、其他层级数),可以调整展开逻辑,但核心思路都是先把字典的层级映射到MultiIndex的各个层级,再对应到列数据。

内容的提问来源于stack exchange,提问作者Victor Serra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:05:24