首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据之前的行在pandas数据框中填写日期

根据之前的行在pandas数据框中填写日期
EN

Stack Overflow用户
提问于 2019-05-21 02:09:20
回答 1查看 382关注 0票数 -2

我有以下数据帧:

代码语言:javascript
复制
         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列:

  1. 如果date_two列在该行中已有值,则对date_one列中的第一行不执行任何操作
  2. 使用当日日期或从date_one列开始的6个月填写date_two列对于所有其他行,使用当前行上方的D13列中日期前一天的日期或当前行中距D14日期6个月的日期填写<

>D12列,以较早的日期填写

最终结果看起来是这样的:

代码语言:javascript
复制
         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,但不确定如何访问前一行中的值

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-21 03:27:42

我假设两个date列都是DateTime类型,因此缺少的date_two值实际上是NaT,而不是None

代码语言:javascript
复制
       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开始:

代码语言:javascript
复制
df['date_one_prev'] = df.date_one.shift()

注意,对于第一行,date_one_prev是NaT,这将很快被使用。

然后定义要应用于每行的函数:

代码语言:javascript
复制
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

并进行实际处理,应用此函数:

代码语言:javascript
复制
df.date_two = df.apply(fn, axis=1)

剩下的唯一要做的就是删除辅助列:

代码语言:javascript
复制
df.drop(columns=['date_one_prev'], inplace=True)

注意:根据您的评论,我使用了180天而不是6个月。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56226108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档