Python实现文件夹内多CSV文件按UNITID分组并合并为单一DataFrame的方法
基于UNITID合并多CSV文件并保留所有列的解决方案
嘿,这个需求其实就是典型的多表基于共同主键合并的场景,用pandas就能完美解决,我给你拆解成清晰的步骤:
1. 准备依赖与导入库
首先确保你已经安装了pandas,如果还没装,先在终端运行:
pip install pandas
然后在代码里导入需要的库:
import pandas as pd import os from functools import reduce
2. 批量读取文件夹内的所有CSV文件
先指定你的CSV文件夹路径,然后遍历读取每个文件,把它们的DataFrame存入一个列表中:
# 替换成你的CSV文件夹实际路径 folder_path = "/your/csv/folder/path" data_frames = [] for file_name in os.listdir(folder_path): if file_name.endswith(".csv"): full_path = os.path.join(folder_path, file_name) # 把UNITID设为字符串类型,避免带前导零的ID被转成整数丢失信息 df = pd.read_csv(full_path, dtype={"UNITID": str}) data_frames.append(df)
3. 基于UNITID合并所有DataFrame
因为所有文件只有UNITID是共同列,其他列互不重复,我们可以用reduce函数批量合并所有表:
# 合并方式选"inner"会只保留在所有CSV中都存在的UNITID;如果想保留所有出现过的UNITID,改成"outer" merged_result = reduce(lambda left_df, right_df: pd.merge(left_df, right_df, on="UNITID", how="inner"), data_frames)
这里解释下how参数的区别:
inner:仅保留在所有CSV文件中都出现的UNITID记录outer:保留任意CSV中出现的UNITID,缺失的列值会填充为NaN
你可以根据业务需求选择合适的合并方式。
4. 验证结果与导出(可选)
合并完成后,你可以查看结果,或者导出为新的CSV文件:
# 查看合并后DataFrame的前5行 print(merged_result.head()) # 导出为新的CSV,index=False表示不保存索引列 merged_result.to_csv("merged_units.csv", index=False)
额外小贴士
- 如果某个CSV文件里存在重复的
UNITID记录,建议合并前先处理重复项,比如用df.groupby("UNITID").first()取第一条,或者根据需求做聚合,避免合并后出现冗余行 - 万一遇到列名冲突(虽然你说其余列都不同,但以防万一),可以在读取文件时给非UNITID的列加上文件名前缀,方便区分:
df = pd.read_csv(full_path, dtype={"UNITID": str}) # 给除了UNITID之外的列添加文件名前缀 prefix = file_name.split(".")[0] + "_" df = df.add_prefix(prefix) # 把加了前缀的UNITID改回原名称 df.rename(columns={prefix + "UNITID": "UNITID"}, inplace=True) data_frames.append(df)
内容的提问来源于stack exchange,提问作者CIHAnalytics
相关产品推荐
相关产品推荐

