如何用含列表的字典在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
相关产品推荐
相关产品推荐

