根据Python中两列或多列的条件从上一行或下一行获取值



我使用Pandas Python来计算行之间的时间增量,当它使用前一行或下一行时,时间增量是基于条件的。

我的桌子是这样的样品台

我想创建具有以下条件的时间增量列:当STATUS>状态_之前并且当STATUS<status_after。

我尝试了几种方法来做到这一点,但最终大多出现了这个错误:

The truth value of a Series is ambiguous. Use a.empty, a.bool(),a.item(), a.any() or a.all().

这是我所做的一个例子:

if db.STATUS == 0 and db.status_before == 1:
db.delta = db['REPORTDATE'].shift()

有什么解决方案吗?

  • 要获得更高质量的答案,请始终以文本而非图像的形式提供样本数据
  • np.where()允许在赋值中使用条件逻辑
  • 您的逻辑没有指定在不满足条件时要使用的值,所以我使用了REPORTDATE
import numpy as np
df = pd.DataFrame({"REPORTDATE":pd.date_range("2021-06-18", freq="8h", periods=5), "NAMA":["WPP 571"]*5, 
"PELABUHAN":(["PP Belawan","di laut"]*3)[1:6], "STATUS":([1,0]*3)[0:5],
"ASAL":(["PP Belawan","di laut"]*3)[0:5], "IGNORED":[0]*5,
"INSERTTIME":[pd.to_datetime("2021-06-24 09:26:35")]*5})

(
df.assign(
status_after=df["STATUS"].shift(-1), status_before=df["STATUS"].shift()
).assign(
timedelta=lambda d: np.where(
(d.STATUS == 0) & (d["status_before"] == 1),
d["REPORTDATE"].shift(),
d["REPORTDATE"],
)
)
)

输出

报表日期DINSERTTIME02021-06-18 00:00:00WPP 571>td style="text-align:left;align:left;">2021-06-24 09:26:350nan2021-06-18 00:00:0012021-06-18 08:00:00WPP 571PP Belawan0>di laut>0 6-24 09:26:35112021-06-18 00:00:0022021-06-18 16:00:00002021-06-18 16:00:0032021-06-19 00:00:00>WPP 571PP Belawan 4 09:26:35112021-06-18 16:00:0042021-06-19 08:00:00WPP 571>td style="text-align:left;">di lautPP Belawan0>2021-0 6-24 09:26:35南style="text align:right;">02021-06-19 08:00:00

最新更新