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)
修正说明
- 读取CSV时添加
header=None,保留原始行结构,避免将**PROJ识别为表头 - 将目标DataFrame的初始化放在循环外,确保每次追加都基于之前的结果
- 用
start_collecting标记控制收集逻辑,遇到**PROJ后开始收集,遇到**ABBR立即终止 - 正确处理
iterrows()返回的行数据,将行转为结构一致的DataFrame后再合并 - 将
return移到循环外部,确保遍历完所有符合条件的行后再返回结果
内容的提问来源于stack exchange,提问作者Ross Clark
相关产品推荐
相关产品推荐

