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

如何从特定结构的Python字典创建带MultiIndex的DataFrame?

如何从字典快速创建带MultiIndex的DataFrame?

问题背景

我从数据中读取信息创建了一个字典,结构如下:

{
    ('B60_L50', '128', 'CP', 'S5', 'side', '2022-05-05_20-04-42 S101_z200'): defaultdict(dict, {200: 6.352113278610182}),
    ('B60_L50', '128', 'CP', 'S5', 'side', '2022-05-05_20-04-42 S102_z200'): defaultdict(dict, {200: 5.621293764849755}),
    ('B60_L50', '128', 'CP', 'S5', 'side', '2022-05-05_20-04-42 S103_z200'): defaultdict(dict, {200: 5.979359334924249}),
    ('B60_L50', '128', 'CP', 'S5', 'side', '2022-05-05_20-04-42 S104_z200'): defaultdict(dict, {200: 3.587064282376453})
}

其中:

  • 字典的键是MultiIndex的元组值,对应索引名称:["Coil", "Frequency", "Polarisation", "S-Value", "Orientation", "First_Row_Element"]
  • 字典的值是嵌套字典,键是DataFrame的列名(如200),值是对应单元格的数值

之前我通过逐个插入值的方式创建DataFrame,但数据量大时效率极低。之前的构建方式如下:

ind = pd.MultiIndex.from_product(
    [coils, frequencies, polarisations, s_values, orientations, titles],
    names=["Coil", "Frequency", "Polarisation", "S-Value", "Orientation", "First_Row_Element"]
)
df = pd.DataFrame(None, index=ind, columns=list(landmarks))  # Convert landmarks set to list

现在需要直接从上述字典快速创建带MultiIndex的DataFrame。

快速创建方法

方法1:直接转换字典生成DataFrame

利用pandas内置的from_dict方法,直接将字典结构转换为DataFrame,再设置MultiIndex名称:

import pandas as pd
from collections import defaultdict

# 假设你的字典名为data_dict
data_dict = {
    ('B60_L50', '128', 'CP', 'S5', 'side', '2022-05-05_20-04-42 S101_z200'): defaultdict(dict, {200: 6.352113278610182}),
    ('B60_L50', '128', 'CP', 'S5', 'side', '2022-05-05_20-04-42 S102_z200'): defaultdict(dict, {200: 5.621293764849755}),
    ('B60_L50', '128', 'CP', 'S5', 'side', '2022-05-05_20-04-42 S103_z200'): defaultdict(dict, {200: 5.979359334924249}),
    ('B60_L50', '128', 'CP', 'S5', 'side', '2022-05-05_20-04-42 S104_z200'): defaultdict(dict, {200: 3.587064282376453})
}

# 转换字典为DataFrame,orient='index'表示用字典的键作为行索引
df = pd.DataFrame.from_dict({k: v for k, v in data_dict.items()}, orient='index')

# 设置MultiIndex的名称
df.index.names = ["Coil", "Frequency", "Polarisation", "S-Value", "Orientation", "First_Row_Element"]

方法2:保留全量索引(含空值行)

如果需要保留之前通过from_product生成的全量索引(包含无数据的行),可以先创建空DataFrame,再用update批量填充数据:

# 先按原方式创建全量索引的空DataFrame
ind = pd.MultiIndex.from_product(
    [coils, frequencies, polarisations, s_values, orientations, titles],
    names=["Coil", "Frequency", "Polarisation", "S-Value", "Orientation", "First_Row_Element"]
)
df = pd.DataFrame(None, index=ind, columns=list(landmarks))

# 将字典转换为临时DataFrame,批量更新到空DataFrame中
temp_df = pd.DataFrame.from_dict({k: v for k, v in data_dict.items()}, orient='index')
df.update(temp_df)

效率说明

这两种方法都避免了Python循环逐个插入的低效操作,利用pandas内部优化的矢量化处理逻辑,数据量越大,效率提升越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:47:01