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

如何在Pandas DataFrame中按ID统计连续frame num的行数

解决Pandas按ID统计连续frame num分组行数的方法

核心需求是给每个ID下的连续frame num段统计长度,比如序列[1,2,3,45,47,122,123,124,125]要得到3、1、1、4这样的结果,下面是具体实现步骤:

1. 先给数据排序(必做)

必须按ID和frame num排序,保证每个ID内的frame num是按顺序排列的,不然连续判断会出错:

df = df.sort_values(by=['ID', 'frame num']).reset_index(drop=True)

2. 给每个连续段打分组标识

对每个ID分组后,计算当前frame num和前一个的差值,差值不等于1的地方就是新段的起点,用累加的方式生成每个连续段的唯一ID:

# 计算相邻frame num的差值,第一行补1不影响分组
df['diff'] = df.groupby('ID')['frame num'].diff().fillna(1)
# 差值≠1时标记为新分组,累加得到group_id
df['group_id'] = df.groupby('ID')['diff'].apply(lambda x: (x != 1).cumsum())

3. 统计每个分组的行数

按ID和group_id分组计数,就是每个连续段的长度:

result = df.groupby(['ID', 'group_id'])['frame num'].count().reset_index(name='连续行数')

示例验证

拿你举的例子来说,某ID的frame num序列是[1,2,3,45,47,122,123,124,125],经过上面的处理后,会生成4个group_id,对应的连续行数正好是3、1、1、4,完全符合预期。

更简洁的写法

如果不想生成额外的列,可以把步骤合并成一行链式调用:

result = (df.sort_values(['ID', 'frame num'])
          .groupby('ID')
          .apply(lambda g: g['frame num'].diff().fillna(1).ne(1).cumsum().value_counts())
          .reset_index(name='连续行数')
          .rename(columns={'level_1': '组序号'}))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:00:47