Сравните два столбца, содержащих метки времени в панд

#python #python-3.x #pandas #dataframe #timestamp

Вопрос:

Допустим, у меня есть такой фрейм данных, как этот:

   Col0       Col1                    Col2                   Col3                   Col4
   1.txt  2021-06-23 15:04:30   2021-06-23 14:10:30   2021-06-23 14:15:30   2021-06-23 14:20:30
   2.txt  2021-06-23 14:25:30   2021-06-23 15:30:30   2021-06-23 14:35:30   2021-06-23 14:40:30
 

Я хочу сравнить, больше ли метка времени в Col1, чем в Col2, и если это верно, я хочу удалить метки времени из других столбцов (Col2, Col3, Col4). Я также хочу проверить, больше ли метка времени в Col2, чем в Col3, и если это правда, я хочу удалить метку времени из других столбцов Col3, Col4).

Я попробовал вот это:

 df['Col1'] = pd.to_datetime(df['Col1'])
df['Col2'] = pd.to_datetime(df['Col2'])
df['Col3'] = pd.to_datetime(df['Col3'])
k= (df['Col1'] > df['Col2']).astype(int)
p=(df['Col2'] > df['Col3']).astype(int)

if k>0:
    df['Col2']=np.nan
    df['Col3']=np.nan
    df['Col4']=np.nan
elif p>0:
    df['Col3']=np.nan
    df['Col4']=np.nan 
 

Но это показывает мне эту ошибку:

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

Мой желаемый результат будет выглядеть так:

   Col0       Col1                    Col2               Col3                   Col4
   1.txt  2021-06-23 15:04:30        NaN                 NaN                    NaN
   2.txt  2021-06-23 14:25:30   2021-06-23 15:30:30      NaN                    NaN
 

отредактированный:
Добавлено Col0

Ответ №1:

Простой способ с помощью логической маски:

 dt = df.select_dtypes('datetime')
dt = dt.mask(dt.lt(dt.shift(axis=1)).cumsum(axis=1).astype(bool))

df.loc[:, dt.columns.tolist()] = dt
 
 >>> df
    Col0                Col1                Col2 Col3 Col4
0  1.txt 2021-06-23 15:04:30                 NaT  NaT  NaT
1  2.txt 2021-06-23 14:25:30 2021-06-23 15:30:30  NaT  NaT
 

Комментарии:

1. Привет @corralien, он отлично работает, просто нужно преобразовать все столбцы в datetime (Col1 в Col4). Ваше решение лучше моего, поэтому я приму это. Спасибо!

Ответ №2:

Я попробовал это и получил желаемый результат (когда фрейм данных содержит также другие столбцы с » str » и «float»).:

 df['Col1'] = pd.to_datetime(df['Col1'])
df['Col2'] = pd.to_datetime(df['Col2'])
df['Col3'] = pd.to_datetime(df['Col3'])
df.loc[df['Col1'] > df['Col2'], 'Col2'] = np.nan
df.loc[df['Col1'] > df['Col2'], 'Col3'] = np.nan
df.loc[df['Col1'] > df['Col2'], 'Col4'] = np.nan


df.loc[df['Col2'] > df['Col3'], 'Col3'] = np.nan
df.loc[df['Col2'] > df['Col3'], 'Col4'] = np.nan