панды: добавьте строку в фрейм данных, если значение равно NaT

#python #pandas

Вопрос:

У меня есть фрейм данных ниже

 guest dat1 dat2 f1 f2 guest1 2021-10-21 16:01:01 2021-10-21 08:19:17 NaT NaT guest2 2021-10-21 10:41:53 2021-10-24 07:53:57 2021-10-21 08:19:17 2021-10-21 10:41:53 guest3 2021-10-21 09:00:00 2021-10-21 10:00:00 NaT NaT guest4 2021-10-21 10:00:00 2021-10-22 14:00:00 2021-10-21 10:00:00 2021-10-21 10:00:00  

Я хочу применить функцию, в которой значения f1 и f2 являются NaT, поэтому, если f1 и f2 являются NaT, то в моем ожидаемом выводе отображается строка добавления, где на гостя f1 из

  • первая строка занимает 2021-10-21 00:00:00, а f2 занимает dat1
  • вторая строка занимает dat2, а f2 занимает 2021-10-21 23:59:59.

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

 guest dat1 dat2 f1 f2   guest1 2021-10-21 16:01:01 2021-10-21 08:19:17 2021-10-21 00:00:00 2021-10-21 16:01:01  guest1 2021-10-21 16:01:01 2021-10-21 08:19:17 2021-10-21 08:19:17 2021-10-21 23:59:59  guest2 2021-10-21 10:41:53 2021-10-24 07:53:57 2021-10-21 08:19:17 2021-10-21 10:41:53  guest3 2021-10-21 09:00:00 2021-10-21 10:00:00 2021-10-21 00:00:00 2021-10-21 09:00:00  guest3 2021-10-21 09:00:00 2021-10-21 10:00:00 2021-10-21 10:00:00 2021-10-21 23:59:59   guest4 2021-10-21 10:00:00 2021-10-22 14:00:00 2021-10-21 10:00:00 2021-10-21 10:00:00  

код

 reps = [2 if val=="NaT" else 1 for val in df.f1] df = df.loc[np.repeat(df.index.values, reps)]  

Ответ №1:

Извлеките подмножество, где f1 и f2 есть NaT . Для row_1 внесения изменений в исходный кадр данных row_2 используйте подмножество и соедините его с исходным кадром данных.:

 cond = (df['f1']=='NaT') amp; (df['f2']=='NaT') df_subset = df[cond].replace('NaT', np.nan) df_subset['f1'] = df_subset['f1'].fillna(df_subset['dat2']) df_subset['f2'] = df_subset['f2'].fillna(datetime(2021, 10, 21, 23, 59, 59))  df['f1'] = df['f1'].replace('NaT', np.nan).fillna(datetime(2021,10,21)) df['f2'] = df['f2'].replace('NaT', np.nan).fillna(df['dat1'])  df = pd.concat([df, df_subset], ignore_index=True) df.sort_values(by=['guest']).reset_index(drop=True, inplace=True)  

OUTPUT:

 guest dat1 dat2 f1 f2 0 guest1 2021-10-21 16:01:01 2021-10-21 08:19:17 2021-10-21 00:00:00 2021-10-21 16:01:01 1 guest1 2021-10-21 16:01:01 2021-10-21 08:19:17 2021-10-21 08:19:17 2021-10-21 23:59:59 2 guest2 2021-10-21 10:41:53 2021-10-24 07:53:57 2021-10-21 08:19:17 2021-10-21 10:41:53 3 guest3 2021-10-21 09:00:00 2021-10-21 10:00:00 2021-10-21 00:00:00 2021-10-21 09:00:00 4 guest3 2021-10-21 09:00:00 2021-10-21 10:00:00 2021-10-21 10:00:00 2021-10-21 23:59:59 5 guest4 2021-10-21 10:00:00 2021-10-22 14:00:00 2021-10-21 10:00:00 2021-10-21 10:00:00  

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

1. Вы должны импортировать это from datetime import datetime

2. Я решил добавить . fillna(типа datetime.датавремя(2021, 10, 21, 23, 59, 59)), другая проблема с это строки df_subset[‘Ф1’] = df_subset[‘Ф1’].fillna(df_subset[‘dat2 аппликации’]) : он заполняет F1 с Линукс времени, как справиться с этим, пожалуйста?.

3. Я тебя не понял. потому что эта строка df_subset['f1'] = df_subset['f1'].fillna(df_subset['dat2']) должна заполнять nulls f1 столбец тем, что существует в соответствующей строке dat2 столбца. Так что, может быть, вам стоит проверить свою dat2 колонку/

4. теперь все работает нормально, спасибо !! ^^

5. Пожалуйста, подумайте, принимая ответ, если это поможет. 🙂