Панды применяют значение, если выполняется определенное условие - PullRequest
0 голосов
/ 09 января 2019

У меня есть образец данных в соответствии с ниже:

{'Plan Date': {23186: nan,
  18533: nan,
  17980: nan,
  28559: nan,
  22587: 1572480000000000000,
  22522: 1580428800000000000,
  16639: 1572480000000000000,
  14304: 1572480000000000000},
 'Support Date': {23186: Timestamp('2020-12-31 00:00:00'),
  18533: Timestamp('2022-03-31 00:00:00'),
  17980: Timestamp('2022-03-31 00:00:00'),
  28559: Timestamp('2019-02-28 00:00:00'),
  22587: Timestamp('2019-07-31 00:00:00'),
  22522: Timestamp('2019-07-31 00:00:00'),
  16639: Timestamp('2019-10-31 00:00:00'),
  14304: Timestamp('2019-10-31 00:00:00')},
 'Plan Deadline': {23186: NaT,
  18533: NaT,
  17980: NaT,
  28559: NaT,
  22587: Timestamp('2019-10-31 00:00:00'),
  22522: Timestamp('2020-01-31 00:00:00'),
  16639: Timestamp('2019-10-31 00:00:00'),
  14304: Timestamp('2019-10-31 00:00:00')}}

Я хотел заполнить столбец плановой даты максимум двумя датами, которые находятся в других столбцах одного и того же кадра данных, только если заполнен столбец планового срока. Использование np.where () было очень запутанным, и я надеялся на более элегантный и эффективный способ.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете избежать apply для лучшей производительности и назначить max значение для условия:

data['Plan Date'] = pd.to_datetime(data['Plan Date'])

mask = data['Plan Deadline'].notnull()
data.loc[mask, 'Plan Date'] = data.loc[mask, ['Support Date', 'Plan Deadline']].max(axis=1)
print (data)
       Plan Date Support Date Plan Deadline
14304 2019-10-31   2019-10-31    2019-10-31
16639 2019-10-31   2019-10-31    2019-10-31
17980        NaT   2022-03-31           NaT
18533        NaT   2022-03-31           NaT
22522 2020-01-31   2019-07-31    2020-01-31
22587 2019-10-31   2019-07-31    2019-10-31
23186        NaT   2020-12-31           NaT
28559        NaT   2019-02-28           NaT
0 голосов
/ 10 января 2019

Я нашел способ (с помощью друга) сделать это, опуская np.where и запутанные условия все вместе:

data['Plan Date'] = data[['Support Date', 'Plan Deadline']].apply(lambda x: pd.NaT if pd.isnull(x[1]) else max(x), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...