我有下面的数据帧
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)]
提取其中f1
和f2
具有NaT
的子集。对于row_1
,在原始数据帧中进行更改,对于row_2
,使用子集和将其连接到原始数据帧。:
cond = (df['f1']=='NaT') & (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