【问题标题】:Difference between consecutive dates in pandas groupby [duplicate]pandas groupby中连续日期之间的差异[重复]
【发布时间】:2019-05-17 19:05:13
【问题描述】:

我有一个如下的数据框:

df_raw_dates = pd.DataFrame({"id": [102, 102, 102, 103, 103, 103, 104], "val": [9,2,4,7,6,3,2], "dates": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2002, 3, 3), pd.Timestamp(2003, 4, 4), pd.Timestamp(2003, 8, 9), pd.Timestamp(2005, 2, 3), pd.Timestamp(2005, 2, 8), pd.Timestamp(2005, 2, 3)]})

    id  val      dates
0  102    9 2002-01-01
1  102    2 2002-03-03
2  102    4 2003-04-04
3  103    7 2003-08-09
4  103    6 2005-02-03
5  103    3 2005-02-08
6  104    2 2005-02-03

我想要实现的不是让dates 列有一个diff_dates 列,它表示每个id 的连续日期之间的差异,其中diff_dates 列中每个id 的第一个条目将是0。话虽如此,生成的数据框应该是:

df_processed_dates = pd.DataFrame({"id": [102, 102, 102, 103, 103, 103, 104], "val": [9,2,4,7,6,3,2], "diff_dates": [0, 61, 397, 0, 544, 5, 0]})

    id  val  diff_dates
0  102    9           0
1  102    2          61
2  102    4         397
3  103    7           0
4  103    6         544
5  103    3           5
6  104    2           0

期待您的回答!

【问题讨论】:

    标签: python pandas datetime dataframe group-by


    【解决方案1】:

    使用groupby + diff。然后,您可以提取 days 组件并使用 fillna 填充缺失的条目。

    df_raw_dates.groupby('id').dates.diff().dt.days.fillna(0, downcast='infer')
    
    0      0
    1     61
    2    397
    3      0
    4    544
    5      5
    6      0
    Name: dates, dtype: int64
    

    要将其重新分配为新列,请执行以下操作

    df_raw_dates['date_diff'] = (
        df_raw_dates
           .pop('dates')
           .groupby(df_raw_dates['id'])
           .diff()
           .dt.days
           .fillna(0, downcast='infer'))
    
    
    df_raw_dates
    
        id  val  date_diff
    0  102    9          0
    1  102    2         61
    2  102    4        397
    3  103    7          0
    4  103    6        544
    5  103    3          5
    6  104    2          0
    

    【讨论】:

    • 唯一的评论是我想用新列返回确切的数据框。
    • 嘿@coldspeed 我不久前发布了另一个问题(估算缺失值..)你介意看看吗?
    猜你喜欢
    • 2012-04-23
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多