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

