You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python for循环中pandas append拼接多文件数据异常问题

问题诊断

你的循环存在2个核心逻辑错误,直接导致跨文件的结果没有被累加,仅保留了最后一个文件的处理结果:

  • 累加结果容器初始化位置错误:final_access_hr = pd.DataFrame()被放在了遍历文件的外层循环内部,每次读取一个新文件时,之前所有文件处理后存下来的结果都会被这行代码清空重置。
  • 最终结果赋值位置错误:access_HR_attestaion = final_access_hr.drop_duplicates()同样放在了外层文件循环内部,每次循环都会用当前单文件的处理结果覆盖这个最终变量,完全没有实现多文件结果的拼接。
  • 额外注意:DataFrame.append()方法已经在高版本Pandas中被弃用,官方推荐使用pd.concat()实现数据拼接,避免版本兼容问题。
修正方法
  1. 将存储全量结果的空DataFrame初始化语句移动到外层文件循环的外部,在开始遍历所有文件前就创建好累加容器,禁止在循环内部反复重置该容器。
  2. 每处理完一个文件的合并逻辑,就将当前文件的结果拼接到全局累加容器中。
  3. 等所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:01:11