基于油井ID重置计数的一维深度数据聚类ID生成问题
基于油井ID重置计数的一维深度数据聚类ID生成问题
嘿,我完全懂你遇到的困扰——想给每口油井单独生成从1开始的深度聚类ID,但之前的for循环没达到预期效果对吧?其实不用绕弯子写循环,Pandas的groupby分组功能正好能解决这个问题,比循环高效还不容易出错!
先理清楚核心需求:我们要按油井ID(id)分组,每个组内根据用户指定的深度间隙判断聚类,而且每个油井的聚类ID都要从1重新开始计数。
解决思路
- 先确保数据按油井ID和深度排序(你已经做了这一步,很关键)
- 定义好你需要的深度间隙阈值(比如这里我设为5,你可以根据需求调整)
- 按油井ID分组后,对每个组内的深度序列计算相邻差值,判断是否超过阈值
- 对阈值判断结果做累加,再把序号调整为从1开始
完整可运行代码
import pandas as pd # 原始数据 data = {'id': [1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3], 'depth': [1,2,10,11,70, 0,20,75,150,155, 0,100,105,200,210], 'temp': [1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3], 'surfT': [9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]} # 创建DataFrame df = pd.DataFrame(data) # 按油井ID和深度排序(确保相邻深度是连续的) df.sort_values(by=['id', 'depth'], inplace=True, ascending=True) # 👇 用户自定义深度间隙阈值,可根据需求修改 depth_gap = 5 # 核心操作:按油井分组生成组内聚类ID df['cluster_id'] = df.groupby('id')['depth'].apply( lambda group_depth: (group_depth.diff() > depth_gap).cumsum() + 1 ) # 查看结果 print(df)
代码解释
groupby('id'):把数据按每口油井拆成独立的小组,每个小组单独处理,不会互相干扰group_depth.diff():计算当前组内相邻深度的差值,比如第一组的深度差是1,8,1,59(group_depth.diff() > depth_gap):判断差值是否超过阈值,得到布尔序列(False, True, False, True),True代表这里要开启新聚类cumsum():对布尔序列累加(True=1,False=0),得到从0开始的聚类序号,再加1就让序号从1开始了
运行结果
你会看到每口油井的cluster_id都是从1开始计数的,完全符合需求:
id depth temp surfT cluster_id 0 1 1 1 9 1 1 1 2 1 9 1 2 1 10 1 9 2 3 1 11 1 9 2 4 1 70 1 9 3 5 2 0 2 9 1 6 2 20 2 9 2 7 2 75 2 9 3 8 2 150 2 9 4 9 2 155 2 9 4 10 3 0 3 9 1 11 3 100 3 9 2 12 3 105 3 9 2 13 3 200 3 9 3 14 3 210 3 9 3
为什么之前的for循环没工作?
大概率是因为你在循环中处理每个ID时,没有正确隔离全局的cluster_id计数,导致上一个油井的序号延续到了下一个油井。而groupby天然帮我们做了分组隔离,每个组的计算都是独立的,完美避免了这个问题。
备注:内容来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

