У меня есть датафрейм как

  index    col1                     col2                   col3
    0      2022-09-25 21:00:00    2022-09-25 20:00:00       NaN
    1      2022-09-25 21:26:00        NaN                   NaN
    2      2022-09-25 21:00:00    2022-09-25 22:00:00     2022-09-25 23:00:00
    3      2022-09-25 21:00:00    2022-09-25 22:00:00     2022-09-25 20:00:00
    4      2022-09-25 21:00:00    2022-09-25 23:00:00       NaN

Я хочу отфильтровать строки, для которых col1 < col2 и col2 < col3. В этом случае условие date < NaN всегда должно возвращать значение true.

Мой желаемый результат

  index    col1                     col2                   col3
    1      2022-09-25 21:26:00        NaN                   NaN
    2      2022-09-25 21:00:00    2022-09-25 22:00:00     2022-09-25 23:00:00
    4      2022-09-25 21:00:00    2022-09-25 23:00:00       NaN

Индекс 0 удаляется, потому что col1 > col2, а индекс 3 удаляется, потому что col2 > col3.

0
user2512443 27 Сен 2022 в 21:19

2 ответа

Лучший ответ

По умолчанию сравнение с NaT всегда дает False.

Чтобы получить True, вы можете использовать обратное условие и инвертировать его:

# ensure datetime
df[['col1', 'col2', 'col3']] = df[['col1', 'col2', 'col3']].apply(pd.to_datetime)

# not col1 greater or equal than col2
m1 = ~df['col1'].ge(df['col2'])
# not col2 greater or equal than col3
m2 = ~df['col2'].ge(df['col3'])

out = df[m1&m2]

Выход:

   index                col1                col2                col3
1      1 2022-09-25 21:26:00                 NaT                 NaT
2      2 2022-09-25 21:00:00 2022-09-25 22:00:00 2022-09-25 23:00:00
4      4 2022-09-25 21:00:00 2022-09-25 23:00:00                 NaT
1
mozway 27 Сен 2022 в 22:06

Мой собственный подход заключается в следующем:

import datetime 

df['diff_1'] = pd.to_datetime(df['col_2']) - pd.to_datetime(df['col_1'])
df['diff_1'] = df['diff_1'].dt.total_seconds()
m1 = (df['diff_1'] > 0) | (clean_json['diff_1'].isnull())


df['diff_2'] = pd.to_datetime(df['col_3']) - pd.to_datetime(clean_json['col_2'])
df['diff_2'] = df['diff_2'].dt.total_seconds()
m2 = (df['diff_2'] > 0) | (df['diff_2'].isnull())

 out = df[m1 & m2]
0
user2512443 27 Сен 2022 в 22:34