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

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 我的包不够大,放不下你展示给我的所有美丽 :-) 你太客气了。你学到了很多技巧,也向我展示了一些技巧(-:

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

通过多个标签过滤或选择熊猫中两行之间的数据

按列表过滤熊猫数据框

熊猫数据框 - 按字符串过滤/选择列是不是保留顺序?

按时间戳列过滤/选择熊猫数据帧的行

从熊猫数据框中选择排序组的第一行

如何通过熊猫过滤满足正则表达式的行