Python Pandas 获取列匹配特定值的行的索引

竹里
竹里
发布时间:2026-10-13| 6人浏览过
原创

本文详解如何在 Python Pandas 中高效获取满足特定条件的行索引。对比了低效的迭代方式,重点介绍了使用布尔索引直接获取 index 列表的方法,并深入解析了 iloc(位置索引)与 loc(标签索引)的区别。同时提供了利用 np.flatnonzero 获取序数索引的技巧,帮助开发者避免常见的索引混淆错误。

问题背景与常见误区

假设有一个包含列 "BoolCol" 的 DataFrame,我们需要找出满足条件 "BoolCol" == True的DataFrame 的行所对应的索引位置。

一种常见的做法是通过循环迭代来实现:


for i in range(100,3000):
  if df.iloc[i]['BoolCol']== True:
     print i,df.iloc[i]['BoolCol']

这种方法虽然可以运行,但并非 Pandas 推荐的标准做法,效率较低。经过研究,更优的代码实现如下:

df[df['BoolCol'] == True].index.tolist()

上述代码返回了一个索引列表,但直接使用该列表中的元素去访问原始 DataFrame 时,结果可能与预期不符。例如,尝试通过该索引访问具体行时:

df.iloc[i]['BoolCol']

你会发现实际返回的结果往往是 False 或者引发错误,这表明直接混用索引类型存在问题。

那么,如何使用符合 Pandas 规范的方式来正确获取这些行的索引呢?

正确获取索引的方法

以下是最佳的解决方案。

iloc 与 loc 的区别及索引使用技巧

首先需要明确的是,df.iloc[i] 返回的是 DataFrame 中第 i 行数据,这里的 i 代表的是从 0 开始的整数位置索引,而非 DataFrame 自定义的索引标签。

相反,属性 index 返回的是实际的索引标签(index labels),而不是数字化的行号。例如:

df.index[df['BoolCol'] == True].tolist()

或者采用等价的方式:

df.index[df['BoolCol']].tolist()

为了更清晰地展示这种差异,我们可以创建一个带有非连续或非默认索引的 DataFrame 进行演示:


df = pd.DataFrame({'BoolCol': [True, False, False, True, True]},
    index=[10,20,30,40,50])
In [53]: df
Out[53]: 
  BoolCol
10  True
20  False
30  False
40  True
50  True
[5 rows x 1 columns]
In [54]: df.index[df['BoolCol']].tolist()
Out[54]: [10, 40, 50]

如果你希望基于这些筛选出的索引标签来选取行,


In [56]: idx = df.index[df['BoolCol']]
In [57]: idx
Out[57]: Int64Index([10, 40, 50], dtype='int64')

应当使用 loc 而不是 iloc。具体操作如下:


In [58]: df.loc[idx]
Out[58]: 
  BoolCol
10  True
40  True
50  True

[3 rows x 1 columns]

值得注意的是,loc 同样可以直接接受布尔数组作为筛选条件:


In [55]: df.loc[df['BoolCol']]
Out[55]: 
  BoolCol
10  True
40  True
50  True

[3 rows x 1 columns]

如果你已经生成了一个布尔数组 mask,并且需要获取这些 True 值在原始序列中的序数索引(即从 0 开始的整数位置),可以使用 np.flatnonzero 来计算:


In [110]: np.flatnonzero(df['BoolCol'])
Out[112]: array([0, 3, 4])

最后,若需通过序数索引使用 df.iloc 来选择行,代码如下:


In [113]: df.iloc[np.flatnonzero(df['BoolCol'])]
Out[113]: 
  BoolCol
10  True
40  True
50  True
python pandas

参考文献

Python Pandas: Get index of rows which column matches certain value

总结

以上内容介绍了在 Python Pandas 中获取列匹配特定值行索引的方法。希望这些信息能解决您的疑问,如有其他问题欢迎留言交流。感谢支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。