如何从特定结构的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
相关产品推荐
相关产品推荐

