Сначала настройте свои условия:
c1 = df.Value.sub(df.Value.shift()).gt(0.1)
c2 = df.Value.diff().lt(0.1) & df.TransactionId.gt(0)
Теперь используйте np.select
:
df.assign(ChargerState=np.select([c1, c2], ['Charging', 'Not Charging'], 'Vacant'))
TransactionId Value ChargerState
Timestamp
2018-01-07 22:00:00 633025 674.87 Vacant
2018-01-07 22:15:00 633025 676.11 Charging
2018-01-07 22:30:00 633025 677.06 Charging
Возможно, потребуется настроитьc1
, потому что в этом примере, хотя он имеет и TransactionId
, и Value
, он отображается как Vacant
, потому что предыдущей строки нет.
Один из возможных вариантов -Предположим, что если устройство имеет Value
и TransactionID
, оно начало начала зарядки, что можно сделать с помощью fillna
на c1
:
c1 = df.Value.sub(df.Value.shift().fillna(0)).gt(0.1) # Notice the fillna
c2 = df.Value.diff().lt(0.1) & df.TransactionId.gt(0)
df.assign(ChargerState=np.select([c1, c2], ['Charging', 'Not Charging'], 'Vacant'))
TransactionId Value ChargerState
Timestamp
2018-01-07 22:00:00 633025 674.87 Charging
2018-01-07 22:15:00 633025 676.11 Charging
2018-01-07 22:30:00 633025 677.06 Charging