Python 基于df中上一行和下一行的基于条件的检查

Python 基于df中上一行和下一行的基于条件的检查,python,pandas,linux-df,Python,Pandas,Linux Df,我想对以下df进行基于条件的比较 ID type state value 0 123123 1 LOW 5 2 123123 2 LOW 8 5 123123 2 HIGH 2 7 123123 1 LOW 3 1 123412 2 HIGH 21 6 123412 1 LOW 12 3 234234 2

我想对以下df进行基于条件的比较

     ID     type  state   value
0  123123     1    LOW      5
2  123123     2    LOW      8
5  123123     2    HIGH     2
7  123123     1    LOW      3
1  123412     2    HIGH     21
6  123412     1    LOW      12
3  234234     2    LOW      5
8  234234     1    LOW      1
4  432424     2    HIGH     9
9  432424     1    HIGH     7
因此,我要做的是检查列状态中的值为低的每一行,如果行中的以下值或之前的值为高。如果是,我想检查row type中的值是否相同。如果再次满足此条件,我想检查此值之间的差值是否小于2。如果是这样,则名为validate的新列应为true,否则应为false

因此,我正在寻找一种方法来检查这种情况下的效率

我曾考虑过使用apply来执行此操作,但是我不确定接下来如何检查给定行前后的值

到目前为止,我只想通过在数据帧上迭代来实现它,但这应该是非常慢的。。。所以,如果你们中有人知道如何解决这个问题,我将非常感激

结果应该是这样的:

     ID     type  state   value  valid
0  123123     1    LOW      5      False
2  123123     2    LOW      4      True
5  123123     2    HIGH     2      
7  123123     1    LOW      3      True
1  123412     1    HIGH     21     
6  123412     1    LOW      12     False
3  234234     2    LOW      5      False
8  234234     1    LOW      1      False
4  432424     2    HIGH     9      
9  432424     1    HIGH     7    
这里再次总结了行为真的基于行的条件

  • 行之前或之后的状态为高
  • 对于高的行(或如果适用,两者都有),则检查类型是否相同
  • 最后检查值之间的差值是否小于2

您可以使用df.shift方法并将您的df与移位的df进行比较。这样就不需要循环。

您可以使用df.shift方法并将您的df与移位的df进行比较。这样就不需要循环。

试试这个-

df.loc[df.state == 'LOW', 'valid'] = False
df.loc[(df.state != df.state.shift(-1)) & (df.state == 'LOW'), 'valid'] = True
试试这个-

df.loc[df.state == 'LOW', 'valid'] = False
df.loc[(df.state != df.state.shift(-1)) & (df.state == 'LOW'), 'valid'] = True
使用和为
状态
类型
条件创建一个
上|下
掩码

below=df.state.eq('LOW')和df.state.shift(-1)。eq('HIGH')和df.type.shift(-1)。eq(df.type)和df.value.diff(-1)。abs().le(2)
上面=df.state.eq('LOW')&df.state.shift().eq('HIGH')&df.type.shift().eq(df.type)&df.value.diff().abs().le(2)
df.loc[df.state.eq('LOW'),'valid']=False
df.loc[上方|下方,'有效']=真
索引7的输出不同,但我不明白为什么您的预期输出显示为
True
,因为上面的
类型不同(1对2),下面的
值的差异是18:

       ID  type state  value  valid
0  123123     1   LOW      5  False
2  123123     2   LOW      4   True
5  123123     2  HIGH      2    NaN
7  123123     1   LOW      3  False
1  123412     2  HIGH     21    NaN
6  123412     1   LOW     12  False
3  234234     2   LOW      5  False
8  234234     1   LOW      1  False
4  432424     2  HIGH      9    NaN
9  432424     1  HIGH      7    NaN
使用和为
状态
类型
条件创建一个
上|下
掩码

below=df.state.eq('LOW')和df.state.shift(-1)。eq('HIGH')和df.type.shift(-1)。eq(df.type)和df.value.diff(-1)。abs().le(2)
上面=df.state.eq('LOW')&df.state.shift().eq('HIGH')&df.type.shift().eq(df.type)&df.value.diff().abs().le(2)
df.loc[df.state.eq('LOW'),'valid']=False
df.loc[上方|下方,'有效']=真
索引7的输出不同,但我不明白为什么您的预期输出显示为
True
,因为上面的
类型不同(1对2),下面的
值的差异是18:

       ID  type state  value  valid
0  123123     1   LOW      5  False
2  123123     2   LOW      4   True
5  123123     2  HIGH      2    NaN
7  123123     1   LOW      3  False
1  123412     2  HIGH     21    NaN
6  123412     1   LOW     12  False
3  234234     2   LOW      5  False
8  234234     1   LOW      1  False
4  432424     2  HIGH      9    NaN
9  432424     1  HIGH      7    NaN

为什么预期输出中的
类型
列中的值会更改?例如,在第2行中,您有
value=8
,在预期输出
value=4
中,您是否也希望前后两行的“类型”相同?请详细说明您的问题。为什么索引7的预期输出
为True
?上面的一行未通过
类型
条件(
1!=2
),下面的一行未通过
(差异为18)。我的错,感谢您注意到预期输出中
类型
列中的值为什么发生更改?例如,在第2行中,您有
value=8
,在预期输出
value=4
中,您是否也希望前后两行的“类型”相同?请详细说明您的问题。为什么索引7的预期输出
为True
?上面的一行不符合
类型
条件(
1!=2
),下面的一行不符合
(差异为18)。我的不好,谢谢注意