高效遍历DataFrame并应用条件:为车辆划分行程
高效解决方案:基于Pandas矢量化分组操作
直接用Pandas的分组+矢量化计算就能高效实现需求,完全不需要iterrow()这类低效循环:
import pandas as pd # 构造示例DataFrame(实际使用时替换为你的大型数据) data = { 'vehicle id': [0,0,0,0,0,1,1,1,1,1,1,1], 'delta': [0,20,40,400,10,0,10,500,10,10,100,10] } df = pd.DataFrame(data) # 核心逻辑:按车辆分组计算行程编号 df['Trip'] = ( df.groupby('vehicle id')['delta'] # 对每个组,标记delta>50的行并累积计数,加1后转为trip_*格式 .apply(lambda grp: (grp > 50).cumsum() + 1) .map(lambda num: f'trip_{num}') ) # 查看结果 print(df)
逻辑说明
- 分组隔离:通过
groupby('vehicle id')确保每个车辆的行程编号独立计算,互不干扰 - 累积计数:对每个组的
delta列,用grp > 50生成布尔序列(满足条件为1,否则为0),再用cumsum()累积求和——每次遇到delta>50时,累积值就会+1,对应行程编号的递增 - 格式转换:累积计数初始为0,加1后对应初始的
trip_1,再通过map把数字转为要求的字符串格式
性能优势
这个方案全程用Pandas的矢量化操作,所有计算都在底层优化的C环境中执行,相比iterrow()这类Python级循环,处理百万级以上数据时性能能提升几十甚至上百倍,完全适配大型DataFrame的需求。
运行后输出结果与预期完全一致:
vehicle id delta Trip 0 0 0 trip_1 1 0 20 trip_1 2 0 40 trip_1 3 0 400 trip_2 4 0 10 trip_2 5 1 0 trip_1 6 1 10 trip_1 7 1 500 trip_2 8 1 10 trip_2 9 1 10 trip_2 10 1 100 trip_3 11 1 10 trip_3
内容的提问来源于stack exchange,提问作者Mohammad.sh
相关产品推荐
相关产品推荐

