查找Pandas Dataframe中值的索引

Win*_*981 6 iteration pandas

我有一个不应该那么困难的问题,但这让我很难过.必须有一个简单的方法来做到这一点.我有一个来自数据框的系列,如下所示:

               value

2001-01-04     0.134
2001-01-05      Nan
2001-01-06      Nan
2001-01-07     0.032
2001-01-08      Nan
2001-01-09     0.113
2001-01-10      Nan
2001-01-11      Nan
2001-01-12     0.112
2001-01-13      Nan
2001-01-14      Nan
2001-01-15     0.136
2001-01-16      Nan
2001-01-17      Nan
Run Code Online (Sandbox Code Playgroud)

从下到上迭代,我需要在下一个最早日期小于0.100的最早日期找到大于0.100的值的索引.

所以在上面的系列中,我想找到值为0.113的索引,即2001-01-09.下一个早期值低于0.100(2001-01-07为0.031).后两个值大于0.100,但我希望最小值的索引> 0.100,小于阈值,从下到上迭代.

我能想到的唯一方法是反转系列,迭代到第一个(最后一个)值,检查它是否> 0.100,然后再次迭代到下一个早期值,并检查它是否小于0.100.如果不是我做完了.如果它> 0.100我必须再次迭代并测试前面的数字.

当然有一种非混乱的方法来做到这一点我没有看到这避免了所有这种逐步迭代.

在此先感谢您的帮助.

roo*_*oot 7

你基本上是在寻找两个条件.对于第一个条件,您希望给定值大于0.1:

df['value'].gt(0.1)
Run Code Online (Sandbox Code Playgroud)

对于第二个条件,您希望先前的非null值小于0.1:

df['value'].ffill().shift().lt(0.1)
Run Code Online (Sandbox Code Playgroud)

现在,将两个条件与运算符组合,反转生成的布尔索引器,并用于idxmax查找条件所在的第一个(最后一个)实例:

(df['value'].gt(0.1) & df['value'].ffill().shift().lt(0.1))[::-1].idxmax()
Run Code Online (Sandbox Code Playgroud)

这给出了预期的指数值.

上述方法假设至少有一个值满足您所描述的情况.如果您的数据可能无法满足您的情况,您可能需要使用它any来验证解决方案是否存在:

# Build the condition.
cond = (df['value'].gt(0.1) & df['value'].ffill().shift().lt(0.1))[::-1]

# Check if the condition is met anywhere.
if cond.any():
    idx = cond.idxmax()
else:
    idx = ???
Run Code Online (Sandbox Code Playgroud)

在你的问题中,你已经指出两个不等式都是严格的.如果一个值恰好等于0.1,会发生什么?您可能想要更改其中一个gt/ ltto ge/ leto帐户.