Python for循环中pandas append拼接多文件数据异常问题
问题诊断
你的循环存在2个核心逻辑错误,直接导致跨文件的结果没有被累加,仅保留了最后一个文件的处理结果:
- 累加结果容器初始化位置错误:
final_access_hr = pd.DataFrame()被放在了遍历文件的外层循环内部,每次读取一个新文件时,之前所有文件处理后存下来的结果都会被这行代码清空重置。 - 最终结果赋值位置错误:
access_HR_attestaion = final_access_hr.drop_duplicates()同样放在了外层文件循环内部,每次循环都会用当前单文件的处理结果覆盖这个最终变量,完全没有实现多文件结果的拼接。 - 额外注意:
DataFrame.append()方法已经在高版本Pandas中被弃用,官方推荐使用pd.concat()实现数据拼接,避免版本兼容问题。
修正方法
- 将存储全量结果的空DataFrame初始化语句移动到外层文件循环的外部,在开始遍历所有文件前就创建好累加容器,禁止在循环内部反复重置该容器。
- 每处理完一个文件的合并逻辑,就将当前文件的结果拼接到全局累加容器中。
- 等所有3个文件全部遍历处理完成后,再统一对全量累加的数据做去重,得到最终数据集。
修正后的可运行代码如下:
import pandas as pd # 全局累加容器放在循环外初始化,避免被反复重置 final_access_hr = pd.DataFrame() column_list = pd.DataFrame(['HRACF2']) for file in files_path: mainframe_access_HR = pd.read_pickle(file) mainframe_access_HR = mainframe_access_HR.astype(str) if mainframe_access_HR.shape[0]: application = mainframe_access_HR['Owner'].unique()[0] filtered_attestation_data = attestation_data[attestation_data['cleaned_MAL_CODE'] == application] for column in range(len(column_list)): mainframe_access_HR_new = mainframe_access_HR.copy() # 丢弃合并关键字段为空的行 mainframe_access_HR_new.dropna(subset=[column_list.iloc[column, 0]], inplace=True) # 构造合并用ID并做格式标准化 mainframe_access_HR_new['ID'] = mainframe_access_HR_new[column_list.iloc[column, 0]] mainframe_access_HR_new['ID'] = mainframe_access_HR_new['ID'].str.strip().str.upper() # 关联合规数据 merged_data = pd.merge( filtered_attestation_data, mainframe_access_HR_new, how='right', left_on=['a', 'b'], right_on=['a', 'b'] ) # 追加当前批次结果到全局容器 final_access_hr = pd.concat([final_access_hr, merged_data], ignore_index=True) # 所有文件处理完成后统一去重,得到最终结果 access_HR_attestaion = final_access_hr.drop_duplicates().reset_index(drop=True)
运行上述代码后,你可以通过print(len(access_HR_attestaion))校验记录数,正常会得到你预期的2639条结果,不会再出现仅保留最后一个文件77条记录的问题。
内容的提问来源于stack exchange,提问作者Jonnyboi
相关产品推荐
相关产品推荐

