请求优化Python多文件合并代码(提升Pythonic风格)
优化多CSV文件合并的Pythonic实现
你需要合并3个CSV文件的前两列,生成包含主标识列、各文件对应城市及匹配状态的表格,原代码功能可用但冗余度高,下面是更Pythonic的优化方案,解决重复逻辑、冗余合并的问题,同时处理同一标识下城市不一致的情况。
原代码的核心问题
- 重复的文件读取逻辑,三次几乎一致的代码块复用性差
- 混用
csv.reader与pandas,pandas自带的read_csv可直接完成读取+列筛选,无需手动转换DataFrame - 变量命名错误(第三个文件读取上下文误用
file_1) - 多次冗余合并,列筛选与重命名逻辑不够清晰
优化后的代码
import pandas as pd from functools import reduce # 用列表统一管理文件路径,后续新增文件只需追加路径即可 file_paths = [ "path/to/file_1.csv", "path/to/file_2.csv", "path/to/file_3.csv" ] # 封装CSV读取逻辑,统一处理列筛选与重命名 def load_csv(file_path, file_suffix): # 直接读取前两列,指定分隔符 df = pd.read_csv(file_path, delimiter=";", usecols=[0, 1], header=None) # 统一主列名称,城市列按文件区分,避免合并冲突 df.columns = ["Column A", f"City_File{file_suffix}"] return df # 批量加载所有文件,生成DataFrame列表 dfs = [load_csv(path, i+1) for i, path in enumerate(file_paths)] # 合并所有文件的主列与对应城市数据(保留所有行) merged_cities = reduce(lambda left, right: pd.merge(left, right, on="Column A", how="outer"), dfs) # 生成两两文件的匹配标识 match_1_2 = pd.merge(dfs[0], dfs[1], on="Column A", how="outer", indicator="Match_1_2") match_1_3 = pd.merge(dfs[0], dfs[2], on="Column A", how="outer", indicator="Match_1_3") match_2_3 = pd.merge(dfs[1], dfs[2], on="Column A", how="outer", indicator="Match_2_3") # 提取匹配标识列并合并到主表格 match_columns = pd.merge( match_1_2[["Column A", "Match_1_2"]], match_1_3[["Column A", "Match_1_3"]], on="Column A", how="outer" ) match_columns = pd.merge( match_columns, match_2_3[["Column A", "Match_2_3"]], on="Column A", how="outer" ) # 合并城市数据与匹配标识 final_df = pd.merge(merged_cities, match_columns, on="Column A", how="outer") # 新增列:检测同一标识下所有城市是否一致(处理可能的错误数据) def check_city_consistency(row): cities = [row["City_File1"], row["City_File2"], row["City_File3"]] non_null_cities = [city for city in cities if pd.notna(city)] return len(set(non_null_cities)) <= 1 final_df["All_Cities_Consistent"] = final_df.apply(check_city_consistency, axis=1) # 调整列顺序为需求格式 final_df = final_df[["Column A", "City_File1", "City_File2", "City_File3", "Match_1_2", "Match_1_3", "Match_2_3", "All_Cities_Consistent"]] # 可选:保存结果到CSV final_df.to_csv("merged_result.csv", sep=";", index=False)
优化点说明
- 统一读取逻辑:用函数封装重复的读取操作,新增文件只需在路径列表中追加,扩展性更强
- 批量处理:用列表推导式批量加载文件,结合
reduce一次性合并所有城市数据,代码更简洁 - 清晰的命名规则:每个文件的城市列添加后缀,避免合并时列名冲突
- 结构化匹配标识:单独提取两两匹配状态再合并,逻辑更清晰,减少冗余计算
- 错误检测:新增
All_Cities_Consistent列,自动识别同一标识下的城市不一致问题 - 性能优化:避免多次重复合并相同DataFrame,提升处理大文件时的效率
内容的提问来源于stack exchange,提问作者Jorge Vinseiro
相关产品推荐
相关产品推荐

