使用Python合并同一文件夹下含共同client_ID列的多个CSV文件
问题诊断
- 初始的
df为空DataFrame:pd.merge关联空表和新读取的CSV数据时,没有可匹配的行记录,每次合并结果都会是空 - 关联键配置错误:你明确说明所有CSV的共同列是
client_ID,但代码中merge使用的关联键是partner_id,字段不匹配会直接报错或无匹配结果 - 结果未赋值给外层变量:循环内合并的结果仅存储在临时变量
df_file中,从头到尾没有修改过外层的df变量,最后输出的df仍然是最初定义的空表 - 路径拼接不严谨(非核心问题):直接拼接路径字符串容易出现多斜杠的兼容问题,推荐用
os.path.join处理路径拼接
修正方案
根据你的合并需求,可选择以下两种适配方案:
场景1:多个CSV结构一致,需要纵向合并所有行(最常用的多CSV合并需求)
如果所有CSV的列结构一致,仅需把所有文件的行汇总到同一张表,无需关联操作,直接使用pd.concat即可,执行效率更高:
import pandas as pd import glob import os path = r'/folder_path/' # 更稳妥的路径匹配方式,避免多斜杠兼容问题 allfiles = glob.glob(os.path.join(path, "*.csv")) # 先将所有CSV读取为DataFrame存入列表,再一次性合并 df_list = [] for file in allfiles: df_tmp = pd.read_csv(file) df_list.append(df_tmp) # 纵向拼接,ignore_index参数可重置全局行号 df = pd.concat(df_list, ignore_index=True)
场景2:每个CSV存储同一客户的不同维度数据,需要按client_ID横向关联
如果确实需要通过关联键横向拼接多表数据,按以下代码修改即可:
import pandas as pd import glob import os path = r'/folder_path/' allfiles = glob.glob(os.path.join(path, "*.csv")) # 提前判断避免空文件夹报错 if len(allfiles) == 0: raise ValueError("目标文件夹下未找到CSV文件") # 读取第一个文件作为初始关联基准 df = pd.read_csv(allfiles[0]) for file in allfiles[1:]: df_file = pd.read_csv(file) # 关联键改为正确的client_ID,how参数可根据需求调整为inner/left/outer df = pd.merge(df, df_file, on='client_ID', how='outer')
补充说明:merge的
how参数可按需调整:outer保留所有文件出现过的全部client_ID,inner仅保留所有文件共有的client_ID,left仅保留第一个文件的全部client_ID。
内容的提问来源于stack exchange,提问作者afri_cola
相关产品推荐
相关产品推荐

