如何遍历DataFrame行并在满足条件时追加至另一DataFrame?
解决Pandas中筛选行并追加到另一个DataFrame的问题
你的代码没法正常运行主要有两个原因:一是Pandas的append()方法不会原地修改原DataFrame,它会返回一个新的DataFrame对象;二是用iterrows()逐行遍历的效率其实很低,尤其当数据量较大的时候。
下面给你两种可行的解决方案,优先推荐第一种更高效的向量化操作:
方法一:用布尔索引筛选+pd.concat(推荐)
这是Pandas官方推荐的做法,利用向量化操作替代循环,代码简洁且性能更好:
import pandas as pd # 第一步:筛选df_a中满足条件的所有行 filtered_df = df_a[df_a["some_col_val"] == 1] # 第二步:将筛选结果合并到df_b,注意要重新赋值给df_b df_b = pd.concat([df_b, filtered_df], ignore_index=True)
ignore_index=True的作用是重置合并后DataFrame的索引,避免出现重复索引的问题。- 如果你的Pandas版本在2.0及以上,
append()方法已经被弃用,pd.concat是官方替代方案。
方法二:修正你的循环遍历代码(不推荐大数据量)
如果你一定要用循环的方式实现,需要把每次筛选到的行先收集起来,最后一次性合并,而不是每次循环都调用append(频繁创建新DataFrame会严重拖慢速度):
rows_to_add = [] for index, row in df_a.iterrows(): if row["some_col_val"] == 1: rows_to_add.append(row) # 将收集到的行转成DataFrame后合并到df_b df_b = pd.concat([df_b, pd.DataFrame(rows_to_add)], ignore_index=True)
如果你坚持要在循环里逐行追加,必须把append的结果重新赋值给df_b,但这种方式效率极低,不建议使用:
for index, row in df_a.iterrows(): if row["some_col_val"] == 1: df_b = df_b.append(row, ignore_index=True)
内容的提问来源于stack exchange,提问作者yalpsid eman
相关产品推荐
相关产品推荐

