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

Python Pandas:高速探针数据流聚合中匹配键并对特定列求和的实现需求

解决高速路探针数据流的15分钟聚合需求

我来给你捋捋怎么实现这个需求,刚好之前处理过类似的时序聚合场景,用Pandas几步就能搞定。核心思路就是先按匹配键合并两个DataFrame,然后分别处理需要保留新值的字段和需要求和的字段。

具体实现步骤

1. 导入Pandas并准备数据

首先确保你已经导入了Pandas,然后把你的Current_DataFrame和New_DataFrame准备好(这里我用字典模拟你的示例数据):

import pandas as pd

# 模拟现有历史数据
current_data = {
    'uuid': [1, 1, 2],
    'lane-Number': [1, 2, 1],
    'lane-Status': ['GOOD', 'GOOD', 'GOOD'],
    'lane-Volume': [10, 5, 7],
    'lane-Speed': [55, 57, 45],
    'lane-Class1Count': [5, 3, 4],
    'laneClass2Count': [5, 2, 3]
}
Current_DataFrame = pd.DataFrame(current_data)

# 模拟新传入的30秒数据流
new_data = {
    'uuid': [1, 1, 2],
    'lane-Number': [1, 2, 1],
    'lane-Status': ['BAD', 'GOOD', 'BAD'],
    'lane-Volume': [7, 4, 5],
    'lane-Speed': [59, 64, 63],
    'lane-Class1Count': [6, 2, 3],
    'laneClass2Count': [1, 2, 2]
}
New_DataFrame = pd.DataFrame(new_data)

2. 按匹配键合并两个DataFrame

我们用merge方法,以uuid和lane-Number作为连接键,采用outer连接(这样可以覆盖新数据里可能出现的新探针键,不会丢失数据),同时给两个DataFrame的字段加上后缀区分:

merged_df = pd.merge(
    Current_DataFrame,
    New_DataFrame,
    on=['uuid', 'lane-Number'],
    how='outer',
    suffixes=('_current', '_new')
)

3. 按需求处理各字段逻辑

接下来分两类处理字段:

  • 保留新数据值的字段:直接取_new后缀的列,同时处理可能的空值(比如如果是新的探针键,没有历史数据的话,新数据的值直接保留)
  • 需要求和的字段:把历史数据和新数据的对应列相加,空值用0填充(避免出现NaN)
# 保留新数据的状态和速度字段
merged_df['lane-Status'] = merged_df['lane-Status_new'].fillna(merged_df['lane-Status_current'])
merged_df['lane-Speed'] = merged_df['lane-Speed_new'].fillna(merged_df['lane-Speed_current'])

# 对车辆计数类字段求和
sum_columns = ['lane-Volume', 'lane-Class1Count', 'laneClass2Count']
for col in sum_columns:
    merged_df[col] = merged_df[f'{col}_current'].fillna(0) + merged_df[f'{col}_new'].fillna(0)

# 整理成目标DataFrame的结构
Goal_DataFrame = merged_df[['uuid', 'lane-Number', 'lane-Status', 'lane-Volume', 'lane-Speed', 'lane-Class1Count', 'laneClass2Count']]

# 把数值转成整数(车辆计数和速度都是整数,避免出现小数)
Goal_DataFrame[sum_columns + ['lane-Speed']] = Goal_DataFrame[sum_columns + ['lane-Speed']].astype(int)

4. 验证结果

运行完上面的代码后,输出Goal_DataFrame就能得到你想要的结果:

uuid  lane-Number lane-Status  lane-Volume  lane-Speed  lane-Class1Count  laneClass2Count
0     1            1         BAD           17          59                11                6
1     1            2         GOOD            9          64                 5                4
2     2            1         BAD           12          63                 7                5

实用提示

  • 如果你的数据流是持续每30秒更新一次,记得每次处理完新数据后,把Goal_DataFrame作为下一次的Current_DataFrame,这样就能持续累积15分钟的统计量
  • 用outer连接可以处理新出现的探针uuid+车道组合,避免丢失数据;如果确定新数据的键都在历史数据里,也可以用inner连接提升运行效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:42:47