python dataframe合并两个布尔列



我有一个数据框架。我在做正向和反向减法。稍后,执行比较并生成布尔输出。接下来,我想对这些结果执行逻辑运算并生成一个结果。

代码:

xdf = pd.DataFrame({'data':range(0,6)},index=pd.date_range('2022-06-03 00:00:00', '2022-06-03 00:00:25', freq='5s'))
# perform 1 row backward substraction
bs = xdf['data'].diff(1).abs().le(1)
# perform 1 row forward substraction
fs= xdf['data'].diff(-1).abs().le(1)

bs = 
2022-06-03 00:00:00    False
2022-06-03 00:00:05     True
2022-06-03 00:00:10     True
2022-06-03 00:00:15     True
2022-06-03 00:00:20     True
2022-06-03 00:00:25     True
Freq: 5S, Name: data, dtype: bool
fs = 
2022-06-03 00:00:00     True
2022-06-03 00:00:05     True
2022-06-03 00:00:10     True
2022-06-03 00:00:15     True
2022-06-03 00:00:20     True
2022-06-03 00:00:25    False

当前和预期输出:

xdf['validation'] = np.logical_and(sa,sb)
2022-06-03 00:00:00    False
2022-06-03 00:00:05     True
2022-06-03 00:00:10     True
2022-06-03 00:00:15     True
2022-06-03 00:00:20     True
2022-06-03 00:00:25    False
Freq: 5S, Name: data, dtype: bool

输出是正确的,这是我所期望的。我的问题是,是否有一种方法可以在一行代码中计算上述所有(向前减法和向后减法)?

也许你可以尝试循环[1,-1],使用np.logical_and.reduce

xdf['validation'] = np.logical_and.reduce([xdf['data'].diff(x).abs().le(1) for x in [1,-1]])
print(xdf)
data  validation
2022-06-03 00:00:00     0       False
2022-06-03 00:00:05     1        True
2022-06-03 00:00:10     2        True
2022-06-03 00:00:15     3        True
2022-06-03 00:00:20     4        True
2022-06-03 00:00:25     5       False

IIUC,您可以使用滚动最大值,然后检查最大值是否≤您的目标:

xdf['validation'] = xdf['data'].diff(-1).abs().rolling(2).max().le(1)

输出:

data  validation
2022-06-03 00:00:00     0       False
2022-06-03 00:00:05     1        True
2022-06-03 00:00:10     2        True
2022-06-03 00:00:15     3        True
2022-06-03 00:00:20     4        True
2022-06-03 00:00:25     5       False

最新更新