Python 基于df中上一行和下一行的基于条件的检查
我想对以下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
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.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)。我的不好,谢谢注意