【问题标题】:Shift dates on the fly based on a condition using pandas根据使用熊猫的条件即时更改日期
【发布时间】:2020-06-18 14:32:25
【问题描述】:

我有一个如下所示的数据框

df1 = pd.DataFrame({'person_id': [11, 21, 31, 41, 51],
                        'date_1': ['12/30/1961', '05/29/1967', '02/03/1957', '7/27/1959', '01/13/1971'],
                        'backward': [0,120,1,2,3],
                        'forward':  [0,12,1,0,0]})
df1['date_1'] = pd.to_datetime(df1['date_1'])

我想做的是

1) 根据forward 列中的值向前移动date_1 列(添加日期)。

2) 如果forward 列的值为0,则从backward 中选择值并移动日期backward(减去日期)

3) 如果forwardbackward 都是0,它不会像我们add/subtract 0 days to date 那样对日期产生任何影响。出于编码目的,如果您仍然想知道要选择哪一列,那么我们可以考虑 backward 列。

这是我尝试过的

df1['new_date'] = df1['date_1'].sub(pd.to_timedelta(df1['forward'],unit='d'))
df1['bool'] = df1['date_1'].eq(df1['new_date']) # i do this to find out which rows aren't changed. So I can look at backward column to subtract days for these records
df1.loc[df1.bool == True, "new_date"] = df1['date_1'].sub(pd.to_timedelta(df1['backward'],unit='d'))

我希望我的输出如下所示。如您所见,对于最后 2 行和第 1 行,forward 列的值为 0,因此我们从 backward 列和 subtract the dates 中选择值

【问题讨论】:

    标签: python python-3.x pandas dataframe python-datetime


    【解决方案1】:

    您可以在前进时使用mask 将0 替换为减去后退列,然后将to_timedelta 这个系列添加到日期

    df1['new_date'] = (df1['date_1'] 
                       + pd.to_timedelta(df1['forward'].mask(lambda x: x.eq(0), 
                                                             -df1['backward']), 
                                         unit='d')
                      )
    print (df1)
       person_id     date_1  backward  forward   new_date
    0         11 1961-12-30         0        0 1961-12-30
    1         21 1967-05-29       120       12 1967-06-10
    2         31 1957-02-03         1        1 1957-02-04
    3         41 1959-07-27         2        0 1959-07-25
    4         51 1971-01-13         3        0 1971-01-10
    

    【讨论】:

    • 嗨,谢谢。一个简单的问题是否也可以输出为每个主题选择的值是多少?这意味着我们知道person_id -21,它是12。包含为每个人选择的值的数据框...
    • @TheGreat IIUC,可以创建专栏df1['date_shift'] = df1['forward'].mask(lambda x: x.eq(0), -df1['backward'])?
    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2023-02-21
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多