基于Pandas实现按前置行条件生成生命周期列的高效方法
高效实现方式(Pandas向量化操作)
直接用Pandas的分组、移位和累积求和操作,完全避免循环,速度比for循环快几个数量级,步骤如下:
- 转换condition为数值标志:将
condition列的True转为1,False转为0,方便后续计算。 - 移位标志列:使用
shift(1)把每个True的影响延迟到下一行,并用fillna(0)填充第一行的空值(因为第一行没有前一行)。 - 分组累积求和:按用户ID分组后,对移位后的标志列计算累积和,最后加1得到初始值为1的
new_col。
代码示例
假设你的DataFrame名为df,用户ID列名为user_id,condition列名为condition:
import pandas as pd # 1. 生成标志列 df['flag'] = df['condition'].astype(int) # 2. 移位并填充空值 df['shifted_flag'] = df.groupby('user_id')['flag'].shift(1).fillna(0) # 3. 分组累积求和后加1得到new_col df['new_col'] = df.groupby('user_id')['shifted_flag'].cumsum() + 1 # 可选:删除中间辅助列 df.drop(['flag', 'shifted_flag'], axis=1, inplace=True)
逻辑验证
拿你给出的示例数据测试,对应关系完全匹配需求:
| condition | flag | shifted_flag | 分组累积和 | new_col |
|---|---|---|---|---|
| False | 0 | 0 | 0 | 1 |
| False | 0 | 0 | 0 | 1 |
| False | 0 | 0 | 0 | 1 |
| True | 1 | 0 | 0 | 1 |
| False | 0 | 1 | 1 | 2 |
| True | 1 | 0 | 1 | 2 |
| True | 1 | 1 | 2 | 3 |
| False | 0 | 1 | 3 | 4 |
效率说明
Pandas的分组、移位、cumsum都是基于NumPy的向量化操作,底层用C实现,比Python级别的for循环快得多,即使处理百万级数据也能秒级完成。
内容的提问来源于stack exchange,提问作者bachts
相关产品推荐
相关产品推荐

