我有一个pandas数据框,它有一个ID列和一个日期列(YYYY-MM-DD(,
ID | 日期 |
---|---|
001 | 2022-01-01 |
001 | 2022-01-04 |
001 | 2022-02-07 |
002 | 2022-01-02 |
002 | 2022-01-03 |
002 | 2022-01-28 |
第一个想法是每个集群使用Rolling.count
,并删除ID
:创建的第一级
df = df.set_index('Date')
df['Ocurrences_last_month'] = (df.groupby('ID')
.rolling('30D')
.count().sub(1).droplevel(0).astype(int))
print (df)
ID Ocurrences_last_month
Date
2022-01-01 1 0
2022-01-04 1 1
2022-02-07 1 0
2022-01-02 2 0
2022-01-03 2 1
2022-01-28 2 2
编辑:如果可能,双工值创建Series
,并通过DataFrame.join
:分配给原始DataFrame
s = df.groupby('ID').rolling('30D', on='Date')['Date'].count().sub(1).astype(int)
df = df.join(s.rename('Ocurrences_last_month'), on=['ID','Date'])
print (df)
ID Date Ocurrences_last_month
0 1 2022-01-01 0
1 1 2022-01-04 1
2 1 2022-02-07 0
3 2 2022-01-02 0
4 2 2022-01-03 1
5 2 2022-01-28 2
来自评论的替代解决方案:
df = df.merge(s.rename('Ocurrences_last_month'), on=['ID','Date'])