如何在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
相关产品推荐
相关产品推荐

