Python 逻辑运算作为 Pandas 中的条件

问题描述 投票:0回答:1

我有一个包含列的数据框:

import pandas as pd
import numpy as np
df = pd.DataFrame({
    'A': [False, True, False, False, False, False, True, True, False, True],
    'B': [True, False, False, False, True, True, False, False, False, False ]
})

df

      A      B
0   False   True
1   True    False
2   False   False
3   False   False
4   False   True
5   False   True
6   True    False
7   True    False
8   False   False
9   True    False

遇到

[True - False]
值对后,如何识别并标记第一个出现
[False - False]
的情况?满足此条件的每一行都需要在新列中进行标记。

在上面的示例中,

[3   False   False]
后面跟着
[6   True    False]
,并且
[8   False   False]
后面跟着
[9   True    False]

这些是本示例中唯一有效的解决方案。

python pandas logical-operators
1个回答
0
投票

您可以使用:

# identify start of group
m1 = df.eq([False, False]).all(axis=1)
# condition
m2 = df.eq([True, False]).all(axis=1)
# form groups
group = m1.cumsum()

# keep only rows with valid condition and after a start of group
# get the first value per group
idx = m2[m2 & (group>0)].groupby(group).idxmax().tolist()

# variant
# idx = m2.index.to_series()[m2 & (group>0)].groupby(group).first().tolist()

# assign flag
df.loc[idx, 'flag'] = 'X'

输出:

       A      B flag
0  False   True  NaN
1   True  False  NaN
2  False  False  NaN
3  False  False  NaN
4  False   True  NaN
5  False   True  NaN
6   True  False    X
7   True  False  NaN
8  False  False  NaN
9   True  False    X

中间体:

       A      B     m1     m2  group flag
0  False   True  False  False      0     
1   True  False  False   True      0     
2  False  False   True  False      1     
3  False  False   True  False      2     
4  False   True  False  False      2     
5  False   True  False  False      2     
6   True  False  False   True      2    X
7   True  False  False   True      2     
8  False  False   True  False      3     
9   True  False  False   True      3    X
© www.soinside.com 2019 - 2024. All rights reserved.