如何用for循环构建嵌套字典存储DataFrame?问题排查与解决
解决嵌套字典存储DataFrame的问题
问题1:正确初始化嵌套字典
有两种可靠方式初始化符合要求的嵌套字典结构:
方式1:手动预初始化所有层级
先明确所有需要处理的速度和测量点,逐层构建字典:
velocities = ['C2', 'C5'] spots = [-45.0, -50.0] # 初始化三层嵌套字典 data_dict = {} for vel in velocities: data_dict[vel] = {} for spot in spots: data_dict[vel][spot] = {}
方式2:用collections.defaultdict自动生成层级
如果不想提前定义所有组合,用defaultdict可以自动创建缺失的层级,避免KeyError:
from collections import defaultdict # 定义嵌套结构:velocity -> spot -> {time: df} data_dict = defaultdict(lambda: defaultdict(dict))
问题2:遍历所有速度和测量点组合
要覆盖所有速度与测量点的组合,需遍历两者的笛卡尔积,以下是完整实现代码:
import os import pandas as pd from collections import defaultdict # 定义所有待处理的速度和测量点 velocities = ['C2', 'C5'] spots = [-45.0, -50.0] base_dir = 'data' # 初始化嵌套字典 data_dict = defaultdict(lambda: defaultdict(dict)) # 遍历所有速度-测量点组合 for vel in velocities: for spot in spots: # 构建当前测量点的目录路径 spot_dir = os.path.join(base_dir, vel, f'spot_{spot}') if not os.path.exists(spot_dir): continue # 目录不存在则跳过 # 遍历目录下的数据文件(假设文件名包含创建时间,如20240520_1430.csv) for filename in os.listdir(spot_dir): if filename.endswith('.csv'): # 从文件名提取创建时间(需根据实际格式调整) time_of_creation = filename.split('.')[0] # 读取DataFrame df = pd.read_csv(os.path.join(spot_dir, filename)) # 存入嵌套字典对应位置 data_dict[vel][spot][time_of_creation] = df # 可选:转换为普通字典(若不需要defaultdict特性) data_dict = dict(data_dict)
关键说明
- 嵌套循环遍历
velocities和spots的所有组合,确保C5、-50.0这类条目被处理 - 用
os.path.join构建跨平台路径,避免手动拼接路径的错误 - 提取创建时间的逻辑需根据实际文件名格式调整,示例假设文件名为「时间戳.csv」形式
内容的提问来源于stack exchange,提问作者ph1lipp
相关产品推荐
相关产品推荐

