Python字典转pandas DataFrame:键为folders列、文件展开为files列
字典转目标结构DataFrame的实现方法
针对给定的「文件夹名: 对应文件列表」字典,要生成每个文件夹和单个文件一一对应成行的扁平DataFrame,实际用的时候有几种常用实现:
方法1:逐元素遍历拼接列数据
这是最直白的基础写法,逻辑完全透明,新手也能一眼看懂每一步在做什么,不需要依赖特殊的pandas API:
import pandas as pd from_this_dict_ = {"folder1": ["file1", "file2"], "folder2": ["file3"] } # 初始化两个列表,分别存两列的最终取值 folder_values = [] file_values = [] for folder_name, file_list in from_this_dict_.items(): # 遍历当前文件夹下的所有文件,逐对匹配文件夹和文件的对应关系 for single_file in file_list: folder_values.append(folder_name) file_values.append(single_file) # 用构造好的列数据生成最终DataFrame to_this_dataframe = pd.DataFrame({ "folders": folder_values, "files": file_values })
方法2:结合explode做列扁平化
这是pandas生态下最简洁高效的写法,核心思路是先把字典转成临时结构——每个文件夹占一行,对应的整个文件列表存在同一行的files列里,再用pandas原生的explode接口把列表列拆成独立行。这种写法处理大字典的时候性能远好于手动循环,是生产环境最常用的方案:
import pandas as pd from_this_dict_ = {"folder1": ["file1", "file2"], "folder2": ["file3"] } # 构造临时的单行对应结构 temp_df = pd.DataFrame( from_this_dict_.items(), columns=["folders", "files"] ) # 展开files列里的列表,重置行索引后就得到和目标完全一致的结构 to_this_dataframe = temp_df.explode("files", ignore_index=True)
小提示:如果某个文件夹下的文件列表是空的,explode默认会把对应的文件夹行直接过滤掉;如果需要保留这类空文件夹的占位行,只要在explode之后对空值做自定义填充就可以。
方法3:列表推导式一次性构造行数据
这是第一种手动循环写法的精简版,通过嵌套列表推导直接生成所有行的元组,不需要手动维护空列表,快速写临时脚本的时候用起来很顺手:
import pandas as pd from_this_dict_ = {"folder1": ["file1", "file2"], "folder2": ["file3"] } # 一次性生成所有(文件夹名, 单个文件)格式的行元组 all_rows = [ (folder_name, single_file) for folder_name, file_list in from_this_dict_.items() for single_file in file_list ] to_this_dataframe = pd.DataFrame(all_rows, columns=["folders", "files"])
这几种写法生成的结果和要求的目标DataFrame结构完全一致,完全可以根据场景选:刚接触pandas可以选第一种写法练手理解逻辑,生产环境处理大体积字典推荐用explode的方法,写临时快速验证的脚本可以用第三种精简写法。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

