为上次记录日期创建列

2024-06-09 21:12:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两列的pandas数据框架:Namedate

我试图创建一个新的列date_last来存储每一行的最后日期

样本输入:

    Name    date    
    John    2020-05-04  
    John    2019-12-10  
    John    2019-11-17  
    John    2019-08-12  
    John    2019-01-10  
    John    2019-01-07
    Sam     2020-05-01  
    Sam     2020-04-15  
    Sam     2020-03-22

所需输入:

    Name    date        date_last
    John    2020-05-04  2019-12-10
    John    2019-12-10  2019-11-17
    John    2019-11-17  2019-08-12
    John    2019-08-12  2019-01-10
    John    2019-01-10  2019-01-07
    John    2019-01-07  None
    Sam     2020-05-01  2020-04-15
    Sam     2020-04-15  2020-03-22
    Sam     2020-03-22  None

我的审判:

df = pd.DataFrame({
    'Name':['John', 'John','John','John','John','John','Sam','Sam','Sam'],
    'date':['2020-05-04', '2019-12-10', '2019-11-17', '2019-08-12', '2019-01-10', '2019-01-07', '2020-05-01', '2020-04-15','2020-03-22']})

df['date'] = pd.to_datetime(df['date']) 
df['dateRank'] = df.groupby('Name').rank('dense') 
df = df.merge(df, on = ['Name'], how = 'outer') 
df = df[df['dateRank_x'] - df['dateRank_y'] == 1] 
df = df[['Name', 'date_x', 'date_y']].rename(columns={'date_x':'date', 'date_y':'date_last'}) 
df

我的输出:

    Name    date        date_last
1   John    2020-05-04  2019-12-10
8   John    2019-12-10  2019-11-17
15  John    2019-11-17  2019-08-12
22  John    2019-08-12  2019-01-10
29  John    2019-01-10  2019-01-07
37  Sam     2020-05-01  2020-04-15
41  Sam     2020-04-15  2020-03-22

有人知道如何实现期望的输出吗


Tags: to数据name框架nonedataframepandasdf
1条回答
网友
1楼 · 发布于 2024-06-09 21:12:07

您可以先对名称和日期进行排序,然后按名称分组并移动日期:

out = df.assign(date_last = df.sort_values(['Name','date'])
                              .groupby('Name',sort=False)['date'].shift())

   Name       date  date_last
0  John 2020-05-04 2019-12-10
1  John 2019-12-10 2019-11-17
2  John 2019-11-17 2019-08-12
3  John 2019-08-12 2019-01-10
4  John 2019-01-10 2019-01-07
5  John 2019-01-07        NaT
6   Sam 2020-05-01 2020-04-15
7   Sam 2020-04-15 2020-03-22
8   Sam 2020-03-22        NaT

相关问题 更多 >