如何使用for循环按文件名中的年份、国家批量匹配合并CSV文件
批量匹配合并同名年份国家CSV文件的Python实现
以下是可直接复用的实现逻辑,适配你提供的文件命名规则:
实现步骤
首先导入依赖库:
import os import pandas as pd
1. 初始化配置与存储容器
# 替换为你本地存储CSV文件的文件夹实际路径 csv_folder_path = "你的CSV文件夹路径" # 存储第一类文件(University/Education开头):键为(年份, 国家),值为文件路径 type1_file_map = {} # 存储第二类文件(Results开头):键为(年份, 国家),值为文件路径 type2_file_map = {} # 存储所有合并后的数据集,可按需后续统一导出或拼接 merged_result = []
2. 遍历文件完成分类归集
for file_name in os.listdir(csv_folder_path): # 跳过非CSV文件 if not file_name.endswith(".csv"): continue # 拆分文件名与后缀,按下划线切割命名片段 name_without_suffix = file_name.rsplit(".", 1)[0] name_segments = name_without_suffix.split("_") # 过滤不符合「前缀_年份_国家」命名规则的文件 if len(name_segments) != 3: print(f"跳过不符合规则的文件:{file_name}") continue prefix, year, country = name_segments full_file_path = os.path.join(csv_folder_path, file_name) # 按前缀分类存入对应字典 if prefix in ("University", "Education"): type1_file_map[(year, country)] = full_file_path elif prefix == "Results": type2_file_map[(year, country)] = full_file_path
3. 批量匹配合并
for (year, country), type1_path in type1_file_map.items(): # 仅两类文件都存在时才执行合并 if (year, country) not in type2_file_map: print(f"缺失年份{year}、国家{country}的Results类文件,跳过合并") continue type2_path = type2_file_map[(year, country)] # 读取两类文件 df_type1 = pd.read_csv(type1_path) df_type2 = pd.read_csv(type2_path) # 按指定字段合并 merged_df = pd.merge(df_type1, df_type2, on=['year','country','region','sociodemographics']) # 可选配置1:单独导出每个合并后的文件,取消注释即可生效 # merged_df.to_csv(f"./merged_output/merged_{year}_{country}.csv", index=False, encoding="utf-8-sig") merged_result.append(merged_df) # 可选配置2:将所有合并结果拼接为一个总表导出,取消注释即可生效 # total_merged_df = pd.concat(merged_result, ignore_index=True) # total_merged_df.to_csv("total_merged_result.csv", index=False, encoding="utf-8-sig")
注意事项
- 若第一类文件还有其他前缀,可自行修改
if prefix in ("University", "Education")中的元组内容 - 合并默认是内连接,若需要保留某侧全部数据可添加
how参数,例:pd.merge(df_type1, df_type2, on=xxx, how="left") - 若合并后出现带
_x/_y后缀的列,说明两类文件除了on指定的公共列外还有其他重名列,可添加suffixes=("_类1", "_类2")参数自定义后缀
内容的提问来源于stack exchange,提问作者panino00
相关产品推荐
相关产品推荐

