我需要分析每个用户最后一次活跃的最后 60 天。
我的数据框包含每个用户('DataSourceId')处于活动状态的日期('CalendarDate')('Activity' 一个整数) - 每个日期一行。我已经按 DataSourceId 对数据框进行了分组,所以我在列中有日期,并且我抓住了每个用户活动的最后一天“max_date”:
df['max_date'] = df.groupby('DataSourceId')['CalendarDate'].transform('max')
datetime64[ns]尽管 'CalendarDate' 和 'max_date' 实际上是格式(活动值是) ,但数据看起来像这样 float64:
ID Jan1 Jan2 Jan3 Jan4 Jan5... max_date
1 8 15 10 Jan5
2 2 13 Jan3
3 6 11 Jan2
现在,我想将日历日期中的列重新排列为每一行的“最后 x 天”。像这样:
ID Last Last-1 Last-2 Last-3 ... Last-x
1 10 15 8
2 13 2
3 11 6
我还没有找到任何类似转换的例子,我真的被困在这里。
编辑: 在调整了 jezrael 的解决方案后,我注意到它在某些情况下失败了。
我认为问题与jezrael解决方案中的这段代码有关:r = data_wide.bfill().isna().sum(axis=1).values
示例:此数据失败(和r = [0 3]):
CalendarDate 2017-07-02 2017-07-03 2017-07-06 2017-07-07 2017-07-08 2017-07-09
DataSourceId
1000648 NaN 188.37 178.37 NaN 128.37 18.37
1004507 51.19 NaN 52.19 53.19 NaN NaN
具体来说,重新对齐的数据框如下所示:
Last-0 Last-1 Last-2 Last-3 Last-4 Last-5
DataSourceId
1000648 18.37 128.37 NaN 178.37 188.37 NaN
1004507 52.19 NaN 51.19 NaN NaN 53.19
如果我通过将 ID 1000648 更改为 1100648(使其成为第二行)来更改数据框中的顺序,则结果是(r = [0 2]):
Last-0 Last-1 Last-2 Last-3 Last-4 Last-5
DataSourceId
1004507 NaN NaN 53.19 52.19 NaN 51.19
1100648 NaN 178.37 188.37 NaN 18.37 128.37