如何汇总测量数据的连续序列:保留首行并统计序列行数
测量数据序列汇总解决方案
需求说明
现有测量数据集包含Start scan(测量启动后时间,单位秒)和Sum.(总值)字段,已过滤高于阈值的数据。需按以下规则处理:
- 连续的
Start scan值属于同一序列,非连续则为不同序列 - 每个序列仅保留首行数据
- 新增
scans summarised字段,记录对应序列的原始行数
代码实现(Python pandas)
import pandas as pd # 加载输入数据(可替换为读取本地文件,如pd.read_csv/Excel) data = pd.DataFrame({ '': [38191, 38192, 38193, 38194, 38195, 38216, 38217, 38218, 38219, 38220, 38230, 38231, 38232, 38247, 38381, 38382, 38383, 38384, 38385, 38386, 38387, 38388, 38389, 38391, 38392], 'Start scan': [247, 248, 249, 250, 251, 272, 273, 274, 275, 276, 286, 287, 288, 303, 437, 438, 439, 440, 441, 442, 443, 444, 445, 447, 448], 'Sum.': [7.06487e+06, 8.64094e+06, 8.82956e+06, 1.20744e+07, 1.28402e+07, 1.85569e+07, 2.83452e+07, 2.6532e+07, 2.2365e+07, 9.0689e+06, 6.92365e+06, 1.0727e+07, 7.81559e+06, 8.14354e+06, 8.4836e+06, 1.56635e+07, 1.24743e+07, 1.84585e+07, 1.82205e+07, 1.79627e+07, 8.56578e+06, 2.28438e+07, 8.19495e+06, 1.39808e+07, 8.30781e+06] }) # 1. 生成序列分组ID:当Start scan与前一行差值≠1时,标记为新序列 data['sequence_id'] = (data['Start scan'].diff() != 1).cumsum() # 2. 统计每个序列的行数 sequence_counts = data.groupby('sequence_id').size().rename('scans summarised') # 3. 合并结果,保留每个序列的首行数据 result = data.groupby('sequence_id').first().join(sequence_counts).reset_index(drop=True) # 调整列顺序以匹配期望输出 result = result[['', 'Start scan', 'Sum.', 'scans summarised']] # 输出格式化结果 print(result.to_markdown(index=False, numalign='right'))
关键逻辑说明
- 序列分组:通过计算
Start scan的前后差值,判断是否为新序列起点,用累积求和生成唯一序列ID - 行数统计:按序列ID分组后统计每组的行数
- 结果合并:取每个序列的首行数据,再合并行数统计结果,最终调整列顺序匹配需求
执行结果
运行代码后将得到与期望一致的输出:
| | Start scan | Sum. | scans summarised | |------:|-------------:|------------:|-------------------:| | 38191 | 247 | 7.06487e+06 | 5 | | 38216 | 272 | 1.85569e+07 | 5 | | 38230 | 286 | 6.92365e+06 | 3 | | 38247 | 303 | 8.14354e+06 | 1 | | 38381 | 437 | 8.4836e+06 | 9 | | 38391 | 447 | 1.39808e+07 | 2 |
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

