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