如何从指定行开始遍历Pandas DataFrame?
解决DataFrame遍历中从指定行开始查找的问题
核心思路
你需要避免在遍历中修改原DataFrame(删除行),同时利用行位置索引,在找到X后直接从当前行的后续部分开始查找Y,避免重复遍历已检查过的行。
优化后的代码方案
方案1:利用enumerate跟踪行位置
import pandas as pd # 存储X和Y对应信息的结果列表 results = [] # 用enumerate获取行的序号(row_count)和行数据 for row_count, (index, row) in enumerate(new_df.iterrows()): if X in row[2]: # 提取X行的所需信息 x_info = { "x_index": index, "x_content": row[2], # 按需添加其他需要提取的字段 } # 内层循环只遍历X所在行之后的部分 for visit_count, (visit_index, visit_row) in enumerate(new_df.iterrows()): # 跳过X行及之前的所有行 if visit_count <= row_count: continue if Y in visit_row[2]: # 提取Y行的所需信息 y_info = { "y_index": visit_index, "y_content": visit_row[2], # 按需添加其他需要提取的字段 } # 合并信息并加入结果列表 results.append({**x_info, **y_info}) # 找到第一个匹配的Y就终止内层循环,继续找下一个X break # 将结果转换为DataFrame result_df = pd.DataFrame(results)
方案2:用iloc切片直接获取后续行(更高效)
这个方法不需要判断行位置,直接通过切片获取X之后的子DataFrame,减少不必要的遍历:
import pandas as pd results = [] for row_count, (index, row) in enumerate(new_df.iterrows()): if X in row[2]: x_info = { "x_index": index, "x_content": row[2], # 按需添加其他字段 } # 直接从X行的下一行开始遍历子DataFrame for visit_index, visit_row in new_df.iloc[row_count + 1:].iterrows(): if Y in visit_row[2]: y_info = { "y_index": visit_index, "y_content": visit_row[2], # 按需添加其他字段 } results.append({**x_info, **y_info}) break result_df = pd.DataFrame(results)
原代码的问题说明
- 不必要的行删除:你之前的
new_df.drop(index, inplace=True)会修改原DataFrame,导致后续查找下一组X和Y时丢失之前的行数据,完全没必要这么做。 - 重复遍历:内层循环从头遍历整个DataFrame,会重复检查已经过的行,浪费资源。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

