我有以下数据帧:
date_one date_two
2634 2018-05-22 None
2018 2017-06-22 2017-09-22
2706 2016-09-14 None
3018 2016-06-22 None
我想使用以下逻辑用日期填充date_two
列:
date_two
列在该行中已有值,则对date_one
列中的第一行不执行任何操作date_one
列开始的6个月填写date_two
列对于所有其他行,使用当前行上方的D13列中日期前一天的日期或当前行中距D14日期6个月的日期填写<>D12列,以较早的日期填写
最终结果看起来是这样的:
date_one date_two
2634 2018-05-22 2018-11-18
2018 2017-06-22 2017-09-22
2706 2016-09-14 2017-03-13
3018 2016-06-22 2016-09-13
注意:date_two
的最后一列包含2016-09-13,因为2016-09-13比该行上的date_one
行中的日期早一天(规则#2)。感谢@WeNYoBen。
我尝试使用iterrows
,但不确定如何访问前一行中的值
发布于 2019-05-21 03:27:42
我假设两个date列都是DateTime类型,因此缺少的date_two值实际上是NaT,而不是None
date_one date_two
2634 2018-05-22 NaT
2018 2017-06-22 2017-09-22
2706 2016-09-14 NaT
3018 2016-06-22 NaT
从计算前一行的辅助列date_one开始:
df['date_one_prev'] = df.date_one.shift()
注意,对于第一行,date_one_prev是NaT,这将很快被使用。
然后定义要应用于每行的函数:
def fn(row):
if pd.isna(row.date_one_prev): # First row
return min(row.date_one + pd.DateOffset(180),
pd.to_datetime('today'))
elif pd.isna(row.date_two): # NaT
return min(row.date_one + pd.DateOffset(180),
row.date_one_prev + pd.DateOffset(-1))
else: # date_two present
return row.date_two
并进行实际处理,应用此函数:
df.date_two = df.apply(fn, axis=1)
剩下的唯一要做的就是删除辅助列:
df.drop(columns=['date_one_prev'], inplace=True)
注意:根据您的评论,我使用了180天而不是6个月。
https://stackoverflow.com/questions/56226108
复制相似问题