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

Python遍历DataFrame并拼接行至指定值出现的问题排查

问题描述

需求是遍历DataFrame,将行追加到新DataFrame中,直到遇到特定值**ABBR。但调用AGS_snip函数后无任何反应,之前的版本还会返回整个DataFrame。

原代码如下:

import pandas as pd


#this function will take a raw AGS file (saved as a CSV) and convert to a
#dataframe.
#it will take the AGS CSV and print the top 5 header lines  
def AGS_raw(file_loc):
    raw_df = pd.read_csv(file_loc)
    #print(raw_df.head())
    return raw_df
    
import_df = AGS_raw('test.csv')

def AGS_snip(raw_df):
    for i in raw_df.iterrows():
        df_new_row = pd.DataFrame(i)
        cut_df = pd.DataFrame(raw_df)
        if "**PROJ" == True:
            cut_df = cut_df.concat([cut_df,df_new_row],ignore_index=True, sort=False)
        elif "**ABBR" == True:
            break
        print(raw_df)
        return cut_df

测试CSV原始文本:

**PROJ,
1,32
1,76
32,56
,
**ABBR,
1,32
1,76
32,56
问题分析

原代码存在多处逻辑错误:

  • cut_df = pd.DataFrame(raw_df)放在循环内部,每次迭代都会重置为原始DataFrame,之前的追加操作完全无效
  • 判断条件"**PROJ" == True和"**ABBR" == True逻辑错误,字符串与布尔值比较永远为False,根本无法触发收集或终止逻辑
  • cut_df.concat用法错误,concat是pandas的顶层函数,应使用pd.concat()而非DataFrame实例方法
  • return cut_df写在循环内部,第一次迭代就直接返回,循环根本没机会遍历后续行
  • 处理iterrows()结果错误,iterrows()返回(索引, 行数据)元组,直接转DataFrame会导致结构混乱
修正后的代码
import pandas as pd

def AGS_raw(file_loc):
    # 用header=None读取,避免把**PROJ当作表头
    raw_df = pd.read_csv(file_loc, header=None)
    return raw_df

import_df = AGS_raw('test.csv')

def AGS_snip(raw_df):
    # 初始化空的目标DataFrame
    cut_df = pd.DataFrame()
    # 标记是否开始收集行数据
    start_collecting = False
    
    for _, row in raw_df.iterrows():
        # 遇到**ABBR时终止循环
        if '**ABBR' in row.values:
            break
        # 遇到**PROJ时开启收集
        if '**PROJ' in row.values:
            start_collecting = True
        # 处于收集状态时,将当前行追加到目标DataFrame
        if start_collecting:
            new_row = pd.DataFrame([row.values], columns=raw_df.columns)
            cut_df = pd.concat([cut_df, new_row], ignore_index=True, sort=False)
    
    return cut_df

# 测试调用
result = AGS_snip(import_df)
print(result)
修正说明
  1. 读取CSV时添加header=None,保留原始行结构,避免将**PROJ识别为表头
  2. 将目标DataFrame的初始化放在循环外,确保每次追加都基于之前的结果
  3. 用start_collecting标记控制收集逻辑,遇到**PROJ后开始收集,遇到**ABBR立即终止
  4. 正确处理iterrows()返回的行数据,将行转为结构一致的DataFrame后再合并
  5. 将return移到循环外部,确保遍历完所有符合条件的行后再返回结果

内容的提问来源于stack exchange,提问作者Ross Clark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:24:19