如何对Pandas抽取生成的部分DataFrame进行特定行索引遍历
Pandas遍历过滤后DataFrame目标行避免KeyError的方法
完全可以,不要手动构造0~1000的索引范围硬匹配,Pandas原生提供了获取实际存在行索引的属性,配合位置索引方法可以完全避免KeyError。
获取新DataFrame的实际行索引
直接访问DataFrame的.index属性就能拿到所有真实存在的行标签,转成Python列表只需要调用.tolist()方法:actual_index_list = new_df.index.tolist()
这个列表里只会包含你之前抽样选中的1、5、9……999这些索引值,不存在的索引不会出现在里面,用这个列表里的值去.loc取值不会触发KeyError。筛选要遍历的交替奇数行
这里要先明确你要的「交替奇数行」是按索引标签筛选,还是按新表的实际行位置筛选,两种场景写法不同:- 按索引标签筛选:你新表的索引本身就是1、5、9……这类奇数,直接对拿到的实际索引列表按步长切片就能拿到交替选取的目标索引,比如
target_index = actual_index_list[::2]就是从第一个索引开始每隔一个取一个,要从第二个开始就改成actual_index_list[1::2]。 - 按行位置筛选:如果你的「奇数行」是指新表中从上到下数的第1、3、5……行(注意Pandas位置计数从0开始,奇数位置对应下标1、3、5……),根本不需要提前拿索引,直接用
.iloc按位置切片遍历即可,完全不关心行标签是什么,不会触发KeyError。
- 按索引标签筛选:你新表的索引本身就是1、5、9……这类奇数,直接对拿到的实际索引列表按步长切片就能拿到交替选取的目标索引,比如
可参考下面的示例代码:
import pandas as pd import numpy as np # 构造原始3列、索引范围0~1000的DataFrame origin_df = pd.DataFrame( np.random.randn(1001, 3), index=range(0, 1001), columns=['col_a', 'col_b', 'col_c'] ) # 抽取索引1、5、9……999的行生成新表 new_df = origin_df.loc[range(1, 1000, 4)] # 方法1:基于真实索引遍历目标行 actual_indexs = new_df.index.tolist() # 交替选取索引遍历,步长2即可实现隔行取 for idx in actual_indexs[::2]: row = new_df.loc[idx] # 写入你的行处理逻辑即可,不会触发KeyError print(idx, row['col_a']) # 方法2:按行位置遍历交替奇数行,无需提前获取索引 # iloc[1::2]表示从位置1开始,每隔一行取一次,对应第2、4、6……行(日常计数的奇数行) for pos in range(1, len(new_df), 2): row = new_df.iloc[pos] # 写入你的行处理逻辑 print(pos, row['col_b'])
做过抽样、过滤、行删除操作的DataFrame,行索引默认不会重置,大概率是不连续、不符合预设范围的,永远不要在外层手动生成索引范围硬套到
.loc上,要么基于.index拿到的真实索引筛选,要么用.iloc做基于位置的访问。
内容的提问来源于stack exchange,提问作者algebroo
相关产品推荐
相关产品推荐

