pandas:如果值为NaT,则在数据帧中添加行



我有下面的数据帧

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)]

提取其中f1f2具有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

最新更新