我有一个数据帧,记录用户、标签以及他们被标记的开始和结束日期例如
用户 | 标签 | 开始日期结束日期 | ||
---|---|---|---|---|
1 | x | 2018-01-01 | 2018-10-01 | |
2 | x | 2019-05-10 | 2020-01-01||
3 | y | 2019-04-01 | 2022-04-20 | |
1 | b | 2018-10-01 | 2020-05-08 |
您可以使用date_range
和to_period
组合生成活动月份,然后使用pivot_table
和aggfunc='nunique'
聚合唯一用户(如果您想计算重复用户,请使用aggfunc='count'
(:
out = (df
.assign(period=[pd.date_range(a, b, freq='M').to_period('M')
for a,b in zip(df['start_date'], df['end_date'])])
.explode('period')
.pivot_table(index='period', columns='label', values='user',
aggfunc='nunique', fill_value=0)
)
输出:
label b x y
period
2018-01 0 1 0
2018-02 0 1 0
2018-03 0 1 0
2018-04 0 1 0
2018-05 0 1 0
...
2021-12 0 0 1
2022-01 0 0 1
2022-02 0 0 1
2022-03 0 0 1
处理NaT
如果你有相同的开始/结束,并且想要计算值:
out = (df
.assign(period=[pd.date_range(a, b, freq='M').to_period('M')
for a,b in zip(df['start_date'], df['end_date'])])
.explode('period')
.assign(period=lambda d: d['period'].fillna(d['start_date'].dt.to_period('M')))
.pivot_table(index='period', columns='label', values='user',
aggfunc='nunique', fill_value=0)
)