np.where перезаписывает th значения - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь создать производный столбец из двух других столбцов в кадре данных pandas, используя np.where.

df['END_TIME'] = np.where(((df['TYPE'] == 'BOLUS') & (df['DESCRIPTION'] == 'rocuronium')),  df['START_TIME'] + dt.timedelta(minutes=30), None)
df['END_TIME'] = np.where(((df['TYPE'] == 'BOLUS') & (df['DESCRIPTION'] == 'vecuronium')),  df['START_TIME'] + dt.timedelta(minutes=45), None)

но происходит, когда я запускаю вторую строку условия np.where, он очищает первые значения результата первого np.where.

DESCRIPTION   TYPE            START_TIME
rocuronium    BOLUS       2018-04-26 05:32:00
rocuronium    BOLUS       2018-04-26 05:38:00
vecuronium    NOT BOLUS   2018-04-26 14:59:59
vecuronium    NOT BOLUS   2018-04-26 15:59:59
vecuronium    BOLUS       2018-04-27 07:50:00

Это фактический фрейм данных, и теперь я пытаюсь создать новый производный столбец на основе типа и описания.Когда я запускаю первый оператор np.where, результирующий кадр данных будет:

DESCRIPTION   TYPE            START_TIME           END_TIME
rocuronium    BOLUS       2018-04-26 05:32:00   2018-04-26 06:02:00
rocuronium    BOLUS       2018-04-26 05:38:00   2018-04-26 06:08:00
vecuronium    NOT BOLUS   2018-04-26 14:59:59
vecuronium    NOT BOLUS   2018-04-26 15:59:59
vecuronium    BOLUS       2018-04-27 07:50:00

Что хорошо.Но если я запускаю второй оператор np.where, результирующий фрейм данных выглядит так.

   DESCRIPTION       TYPE             START_TIME         END_TIME
    rocuronium    BOLUS       2018-04-26 05:32:00   
    rocuronium    BOLUS       2018-04-26 05:38:00   
    vecuronium    NOT BOLUS   2018-04-26 14:59:59           None
    vecuronium    NOT BOLUS   2018-04-26 15:59:59           None
    vecuronium    BOLUS       2018-04-27 07:50:00     2018-04-27 08:35:00

Я не знаю, почему я теряю данные первых операторов np.where.

Ожидаемый фрейм данных:

DESCRIPTION   TYPE            START_TIME           END_TIME
rocuronium    BOLUS       2018-04-26 05:32:00   2018-04-26 06:02:00
rocuronium    BOLUS       2018-04-26 05:38:00   2018-04-26 06:08:00
vecuronium    NOT BOLUS   2018-04-26 14:59:59       None
vecuronium    NOT BOLUS   2018-04-26 15:59:59       None
vecuronium    BOLUS       2018-04-27 07:50:00   2018-04-27 08:35:00

Я попытался создать следующую функцию и вызвать ее:

def add_roc(df):
    if (df['TYPE'] == 'BOLUS') & (df['DESCRIPTION'] == 'rocuronium'):
        df['END_TIME'] = df['START_TIME'] + dt.timedelta(minutes=30)
        return df

, и выдается следующая ошибка:

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

Есть ли лучший способ решения этой проблемы?

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

Используйте np.select для нескольких условий. Это будет хорошо обобщать для многих условий. pd.to_datetime - потому что вещи приводятся к int.

import numpy as np
import pandas as pd

cond_lst = [df['TYPE'].eq('BOLUS') & df['DESCRIPTION'].eq('rocuronium'),
            df['TYPE'].eq('BOLUS') & df['DESCRIPTION'].eq('vecuronium')]
choice_lst = [df['START_TIME']+pd.Timedelta(minutes=30),
              df['START_TIME']+pd.Timedelta(minutes=45)]

df['END_TIME'] = pd.to_datetime(np.select(cond_lst, choice_lst, default=pd.NaT))

Выход:

  DESCRIPTION       TYPE          START_TIME            END_TIME
0  rocuronium      BOLUS 2018-04-26 05:32:00 2018-04-26 06:02:00
1  rocuronium      BOLUS 2018-04-26 05:38:00 2018-04-26 06:08:00
2  vecuronium  NOT BOLUS 2018-04-26 14:59:59                 NaT
3  vecuronium  NOT BOLUS 2018-04-26 15:59:59                 NaT
4  vecuronium      BOLUS 2018-04-27 07:50:00 2018-04-27 08:35:00

В этом случае из-за дихотомической переменной в столбце 'TYPE' я бы предпочел where + map.

d = {'rocuronium': pd.Timedelta(minutes=30), 
     'vecuronium': pd.Timedelta(minutes=45)}

df['END_TIME'] = df['START_TIME'].where(df.TYPE.eq('BOLUS')) + df.DESCRIPTION.map(d)
0 голосов
/ 06 июля 2019

Попробуйте:

df = df.loc[df['DESCRIPTION'].isin(['rocuronium'])]
df = df.loc[df['TYPE'].isin(['BOLUS'])]

Вы должны получить то, что вам нужно :))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...