【发布时间】:2021-07-06 17:41:21
【问题描述】:
我有一个如下所示的数据框
df = pd.DataFrame({'person_id': [101,101,101,101,202,202,202],
'start_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM'],
'end_date':['5/12/2013 09:27:00 AM',np.nan,'06/11/2014 08:00:00 AM',np.nan,'12/16/2011 10:00:00','10/18/2012 00:00:00',np.nan],
'type':['O','I','O','O','I','O','I']})
df.start_date = pd.to_datetime(df.start_date)
df['end_date'] = pd.to_datetime(df.end_date)
我想根据以下两种方法在end_date 列下fillna()
a) 如果在该人的除最后一行之外的任何行中找到NA,则通过复制下一行的值来fillna
b) 如果在 该人的最后一行 fillna 中找到NA,则在他的start_date 上添加 10 天(因为该人没有下一行可供复制. 所以,我们给出 10 天的随机值)
规则a 和b 仅适用于type=I 的人。
对于具有type=O 的人,只需复制start_date 中的值即可。
这是我尝试过的。你可以看到我写了两次相同的代码行。
df['end_date'] = np.where(df['type'].str.contains('I'),pd.DatetimeIndex(df['end_date'].bfill()),pd.DatetimeIndex(df.start_date.dt.date))
df['end_date'] = np.where(df['type'].str.contains('I'),pd.DatetimeIndex(df['start_date'] + pd.DateOffset(10)),pd.DatetimeIndex(df.start_date.dt.date))
任何优雅而有效的方式来编写这个,因为我必须将它应用到一个有 1500 万行的大数据上?
我希望我的输出如下所示
【问题讨论】:
-
您的预期输出似乎不正确。请再次检查并相应地更新预期输出。谢谢。
-
如果在除该人的最后一行之外的任何行中找到 NA,则通过复制下一行的值来填充您是指来自 @987654337@ 的下一行还是
start_date专栏? -
该特定人员的
start_date列的下一行。不是来自其他 person_ids。 -
更新了预期的输出
-
@ShubhamSharma - 顺便说一句,几周前你帮我解决了一个问题。但是忘记写答案了。如果您也可以为旧问题写一个答案(我相信它会在我们的聊天窗口中,我无法访问),我可以投票并接受它。
标签: python pandas dataframe datetime pandas-groupby