Pandas 无循环处理设备采集数据64位无符号整数溢出问题
实现方案
直接使用Pandas向量化操作替代逐行循环,性能远高于迭代写法,核心思路是先拆分「同type且uptime连续递增」的分组,分组内统计累计溢出次数再统一修正值:
完整代码
import pandas as pd # 预处理逻辑和原有代码对齐 df[['col1', 'col2']] = df[['col1', 'col2']].fillna(0).astype(int) # 和原有循环逻辑对齐,需要调整加数值可修改此处 OFFSET_STEP = 2 ** 64 - 1 # 步骤1:生成连续会话分组 # 判断是否为新分组起点:type变化 或 uptime下降 is_new_group = (df['type'] != df['type'].shift(1)) | (df['uptime'] <= df['uptime'].shift(1)) is_new_group.iloc[0] = True df['group_id'] = is_new_group.cumsum() # 步骤2:分组计算累计溢出偏移量 def calc_offset(series): # 当前值小于上一行值则标记溢出,累计溢出次数乘以偏移步长 return (series.diff() < 0).cumsum() * OFFSET_STEP df['col1'] += df.groupby('group_id')['col1'].transform(calc_offset) df['col2'] += df.groupby('group_id')['col2'].transform(calc_offset) # 步骤3:删除临时列(可选) df.drop('group_id', axis=1, inplace=True)
逻辑说明
- 分组逻辑和业务规则完全对齐:只要type变化或者uptime下降就会生成新分组,分组间溢出状态独立,不会互相影响
- 溢出统计用
diff()替代逐行比较,cumsum()直接累计溢出次数,完全符合「溢出一次后同组后续所有行都要加偏移量」的要求 - 支持同分组内多次溢出的场景,比如连续溢出2次就会自动加2倍偏移步长,覆盖场景比原有循环逻辑更全
内容的提问来源于stack exchange,提问作者bhdrozgn
相关产品推荐
相关产品推荐

