Как создать новый столбец в кадре данных на основе условий других столбцов? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть фрейм данных, который выглядит следующим образом:

                             TransactionId   Value
Timestamp                                     
2018-01-07 22:00:00.000         633025      674.87
2018-01-07 22:15:00.000         633025      676.11
2018-01-07 22:30:00.000         633025      677.06

Я хочу создать третий столбец с 3 возможными классами на основе условий двух других столбцов. Я попытался написать функцию ниже, но она не работает - я не получаю возврат при вызове df.head () после вызова функции.

b = df.shape[0]
def charger_state(df):
    a = 1
    while a <= b: 
        if df.Value[a]-df.Value[(a-1)] > 0.1 :
            df['Charger State']= "Charging"
        elif df.Value[a]-df.Value[(a-1)] < 0.1 \
        and df['TransactionId'] > 0:
            df['Charger State']= "Not Charging"
        else: 
            df['Charger State']= "Vacant"
    a = a+1

Другие ответы, связанные с этой темой, похоже, не охватывают 3 класса для нового столбца, но я новичок, поэтому просто не могу его получить.

1 Ответ

0 голосов
/ 17 сентября 2018

Сначала настройте свои условия:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...