在Pandas DataFrame中按user_id计算距首次出现的累计天数
最高效实现方案
核心采用Pandas原生向量化操作实现,无Python层循环,千万级数据量下也可快速执行。
前置操作:转换日期列格式
首先确保date列是Pandas datetime类型,否则无法执行日期运算:
import pandas as pd # format参数可根据实际日期格式调整,能大幅提升转换速度 df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
核心计算逻辑
通过groupby按user_id分组,搭配transform返回和原数据长度一致的每组最小日期(即用户首次出现日期),直接做日期差后提取天数即可:
df['days_since_first_occurence'] = (df['date'] - df.groupby('user_id')['date'].transform('min')).dt.days
效果验证
输入示例
| user_id | date |
|---|---|
| user1 | 2023-01-01 |
| user1 | 2023-01-03 |
| user1 | 2023-01-10 |
| user2 | 2023-02-05 |
| user2 | 2023-02-05 |
| user2 | 2023-02-10 |
输出结果
| user_id | date | days_since_first_occurence |
|---|---|---|
| user1 | 2023-01-01 | 0 |
| user1 | 2023-01-03 | 2 |
| user1 | 2023-01-10 | 9 |
| user2 | 2023-02-05 | 0 |
| user2 | 2023-02-05 | 0 |
| user2 | 2023-02-10 | 5 |
性能说明
- 全程调用Pandas底层C实现的运算逻辑,时间复杂度为O(n)
- 比逐组
apply的写法速度快5~10倍,数据量越大性能优势越明显 - 若数据已提前按
user_id+date排序,也可采用groupby+diff累加的写法,性能与上述方案一致,但可读性略差
内容的提问来源于stack exchange,提问作者ksbawpn
相关产品推荐
相关产品推荐

