如何在DataFrame中新增列实现满足指定条件时重置的递加累计计数?
功能实现方案
你原来的代码无法得到正确结果的核心原因是,np.where是全量向量化运算,不会逐行迭代更新刚计算出的Touch_No值,df.First_touch.shift().add(1)只会取初始状态的前一行值,无法实现连续累加。
实现思路
- 先创建重置分组标记:每次满足「Time_btween_steps为空或值大于30」的重置条件时,分组标记+1,同一个标记对应的行属于同一段需要连续计数的区间
- 按分组标记做分组,每个分组内从1开始递增计数,即可得到符合要求的Touch_No
如果需要针对特定外展对象分别统计,额外在分组时加上对象ID字段即可。
代码实现
全局连续计数(不区分统计对象)
# 生成重置分组标识 df['reset_group'] = ((df['Time_btween_steps'].isnull()) | (df['Time_btween_steps'] > 30)).cumsum() # 分组内计数,从1开始 df['Touch_No'] = df.groupby('reset_group').cumcount() + 1 # 清理临时字段 df.drop('reset_group', axis=1, inplace=True)
按特定对象分别统计(假设对象ID字段为object_id,可替换为你的实际字段名)
# 每个对象单独生成重置分组标识 df['reset_group'] = df.groupby('object_id')['Time_btween_steps'].transform(lambda x: (x.isnull() | x>30).cumsum()) # 按对象+重置分组双重分组后计数 df['Touch_No'] = df.groupby(['object_id', 'reset_group']).cumcount() + 1 df.drop('reset_group', axis=1, inplace=True)
验证结果
用你提供的示例数据测试,运行后输出结果如下:
| Time_btween_steps | Touch_No |
|---|---|
| NaN | 1 |
| 0.0 | 2 |
| 5.4 | 3 |
| 6.7 | 4 |
| 2.0 | 5 |
| NaN | 1 |
| 1.0 | 2 |
完全符合预期要求。
内容的提问来源于stack exchange,提问作者cgphillippi
相关产品推荐
相关产品推荐

