如何通过公共id字段合并文件夹下所有CSV文件并生成目标嵌套字典
问题描述
我有一个存储了多个.csv文件的目录,示例文件如下:
a.csv
id,name 1,john 2,mary 3,alex
b.csv
id,birth 1,01.01.2001 2,05.06.1990
c.csv
id,death 2,01.02.2020 1,-
最终需要得到一个字典,键为int类型的id,值为包含该id跨所有文件的所有字段取值的嵌套字典,预期结构如下:
{ 1: {"id": 1, "name": "john", "birth": "01.01.2001", "death": "-"}, 2: {"id": 2, "name": "mary", "birth": "05.06.1990", "death": "01.02.2020"}, 3: {"id": 3, "name": "alex", "birth": None, "death": None}, }
我目前尝试用如下代码将所有文件合并为一个dataframe:
from pathlib import Path import os import pandas as pd files = Path(r'path').rglob('*.csv') # read in all the csv files all_csvs = [pd.read_csv(file) for file in files] # lump into one table all_csvs = pd.concat(all_csvs, axis=1)
但执行后得到的dataframe中'id'字段重复出现了三列,不符合预期,请问该如何实现需求?
问题原因
你使用pd.concat(all_csvs, axis=1)是直接横向堆叠所有DataFrame,不会自动匹配不同表的id值,所以会出现多列重复的id字段。
实现代码
读取每个csv时先将id设为索引,再做横向拼接,pandas会自动按索引(也就是id值)对齐数据,后续处理完缺失值后转成指定格式的字典即可:
from pathlib import Path import pandas as pd files = Path(r'path').rglob('*.csv') # 读取每个csv并将id设为索引 all_csvs = [] for file in files: df = pd.read_csv(file) df = df.set_index('id') all_csvs.append(df) # 按索引(id)横向拼接所有表 merged_df = pd.concat(all_csvs, axis=1) # 重置索引,把id变回普通列 merged_df = merged_df.reset_index() # 所有空值统一转成None merged_df = merged_df.fillna(value=None) # 确保id为int类型 merged_df['id'] = merged_df['id'].astype(int) # 直接转成要求格式的字典 result = merged_df.set_index('id').to_dict('index')
执行后result就是完全符合预期结构的字典。
内容的提问来源于stack exchange,提问作者artn_01
相关产品推荐
相关产品推荐

