过滤后在熊猫中选择前一行的语法

Posted

技术标签:

【中文标题】过滤后在熊猫中选择前一行的语法【英文标题】:Syntax to select previous row in pandas after filtering 【发布时间】:2018-12-04 15:41:23 【问题描述】:

我有一个 pd.DataFrame df 有 5 行,比如说:

Row    Value
 1      32
 2      25
 3      10
 4      18
 5      21

假设我使用过滤器df[df['Value'] < 15],这应该返回

Row    Value
 3      10

我的问题是,我想在此过滤器返回 True 之前访问该行的值,在此示例中,我希望函数返回值 25(来自第 2 行)。

我的最终目标是应用条件,获取上面的行,然后测试该行是否有其他条件。

我可以使用哪些 pandas 函数?

谢谢!

【问题讨论】:

【参考方案1】:

将蒙版上移 1。

df[(df['Value'] < 15).shift(-1).fillna(False)]

   Row  Value
1    2     25

更一般地说,如果您要查找所有大于 15 的行,其下一行小于 15,您可以计算两个单独的掩码并将它们与:

df[(df['Value'].shift(-1) < 15) & (df['Value'] > 15)]

   Row  Value
1    2     25

【讨论】:

谢谢!如果我想更进一步并检查该值是否高于 15,该怎么办? @AdrianY df[(df['Value'] &gt; 15).shift(-1).fillna(False)]? 对不起,我应该更清楚。我的意思是检查第 2 行中的值是否高于 15。df[(df['Value'] > 15).shift(-1).fillna(False)]['Value'] >15 是否有效?【参考方案2】:

np.flatnonzero

找到掩码在哪里True 然后减一

df.iloc[np.flatnonzero(df.Value < 15) - 1]

   Row  Value
1    2     25

【讨论】:

【参考方案3】:

使用idxmax

>>> df.iloc[df.Value.le(15).idxmax() - 1]

Row       2
Value    25

【讨论】:

【参考方案4】:

使用nonzero

df.iloc[(df['Value'] < 15).nonzero()[0]-1]
Out[34]: 
   Row  Value
1    2     25

【讨论】:

我不知道.nonzero 我只有袋子可以放进去。 @piRSquared 我的包不够大,放不下你展示给我的所有美丽 :-) 你太客气了。你学到了很多技巧,也向我展示了一些技巧(-:

以上是关于过滤后在熊猫中选择前一行的语法的主要内容,如果未能解决你的问题,请参考以下文章