这是我的DataFrame:

import pandas as pd
import numpy as np
df = pd.DataFrame(
    {
        'a': [np.nan, np.nan, 1, 2, 3, 1, 0, 1, -1, -1],
    }
)

我的面具是:

mask = (df.a.gt(2))

而expectet的输出是4.指数为mask.

我可以像这样得到它,但如果没有满足条件的值,它会给我一个错误.如果什么都没找到,我就拿None块.

x = df.loc[mask.cumsum().eq(1) & mask].index[0]

推荐答案

你可以切片并使用first_valid_index:

out = df[mask].first_valid_index()

# or
# out = df.loc[mask, 'a'].first_valid_index()

输出:4

输出mask = df['a'].gt(10):None

idxmaxany:

out = mask.idxmax() if mask.any() else None

或者使用python方法:

out = next((i for i,m in zip(df.index, mask) if m), None)

# alternatively (thanks @ChrisFu)
# out = next((i for i,m in mask.items() if m), None)

如果DataFrame很大,并且第一个True个索引出现得很早,这实际上比矢量化要快.

Timings

如果第一个True个提前出现(df = pd.DataFrame({'a': range(1_000_000)}) ; mask = df['a'].gt(2)):

# df.loc[mask, 'a'].first_valid_index()
5.26 ms ± 140 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# mask.idxmax() if mask.any() else None
17 µs ± 261 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

# next((i for i,m in zip(df.index, mask) if m), None)
2.69 µs ± 11.4 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

如果第一个True个出现晚(mask = df['a'].ge(999_999)):

# df.loc[mask, 'a'].first_valid_index()
426 µs ± 21.8 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

# mask.idxmax() if mask.any() else None
78.4 µs ± 142 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

# next((i for i,m in zip(df.index, mask) if m), None)
91.6 ms ± 1.14 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

对于1M行的输入,取决于第一个True个位置的时序图:

enter image description here

总的来说,使用mask.idxmax() if mask.any() else None似乎是最好的权衡.

Python相关问答推荐

如何在msgraph.GraphServiceClient上进行身份验证?

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

使用SciPy进行曲线匹配未能给出正确的匹配

acme错误-Veritas错误:模块收件箱没有属性linear_util'

使用numpy提取数据块

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

将jit与numpy linSpace函数一起使用时出错

'discord.ext. commanders.cog没有属性监听器'

需要计算60,000个坐标之间的距离

从groupby执行计算后创建新的子框架

我对我应该做什么以及我如何做感到困惑'

Pandas DataFrame中行之间的差异

* 动态地 * 修饰Python中的递归函数

Numpyro AR(1)均值切换模型抽样不一致性

如何在Python 3.9.6和MacOS Sonoma 14.3.1下安装Pyregion

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

为什么dict. items()可以快速查找?

文本溢出了Kivy的视区

将标签与山脊线图对齐