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

基于油井ID重置计数的一维深度数据聚类ID生成问题

基于油井ID重置计数的一维深度数据聚类ID生成问题

嘿,我完全懂你遇到的困扰——想给每口油井单独生成从1开始的深度聚类ID,但之前的for循环没达到预期效果对吧?其实不用绕弯子写循环,Pandas的groupby分组功能正好能解决这个问题,比循环高效还不容易出错!

先理清楚核心需求:我们要按油井ID(id)分组,每个组内根据用户指定的深度间隙判断聚类,而且每个油井的聚类ID都要从1重新开始计数。

解决思路

  1. 先确保数据按油井ID和深度排序(你已经做了这一步,很关键)
  2. 定义好你需要的深度间隙阈值(比如这里我设为5,你可以根据需求调整)
  3. 按油井ID分组后,对每个组内的深度序列计算相邻差值,判断是否超过阈值
  4. 对阈值判断结果做累加,再把序号调整为从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 08:28:05