#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. Пожалуйста, подумайте, принимая ответ, если это поможет. 🙂