You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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_stepsTouch_No
NaN1
0.02
5.43
6.74
2.05
NaN1
1.02

完全符合预期要求。

内容的提问来源于stack exchange,提问作者cgphillippi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:15:09