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

Python中曲线形数据行的分离、排序及编号实现问询

解决方案步骤

1. 数据预处理:扁平化与排序

先提取所有点的x、y数据(忽略原标签列),按y值降序排序,再按x值升序排序——从你提供的数据集来看,每条曲线的点整体y值处于独立区间(最外侧曲线y值最高,内侧曲线y值最低),这种排序方式能让同一条曲线的点自动归为一组。

Python代码示例:

import pandas as pd

# 加载数据集
data = pd.DataFrame({
    'x': [-6.4165, -4.0227, -7.206, -3.2584, -0.7565, -0.0498, 2.363, -10.7253, -8.0621, -4.6328, -1.4237, 1.8047, 4.8147, -5.3504, -1.7743, 1.1783, 4.3471, 7.4067, -2.6037, 0.8613, 3.8054, 7.023, 9.9776, 0.1733, 3.7137, 6.4672, 9.6489, 12.5674, 3.2124, 6.4983, 9.2606, 12.4003, 15.3578, 6.3128, 9.7676, 12.2103, 15.3182, 18.2495, 9.3947, 12.496, 15.3987, 18.2212, 21.1241, 12.3548, 15.3682, 18.357, 21.0834, 23.9992, 15.3776, 18.3568, 21.1733],
    'y': [0.3716, 2.63, 3.0652, -0.0392, 2.1039, -0.5159, 1.5329, 3.4654, 5.9083, 5.3028, 4.8455, 4.2297, 3.6074, 8.1889, 7.6165, 6.9698, 6.2411, 5.5988, 10.4623, 9.7628, 9.0202, 8.1962, 7.5563, 12.6547, 11.9097, 10.9363, 10.1246, 9.3369, 14.7492, 13.7562, 12.7241, 11.878, 11.0027, 16.7014, 15.6557, 14.4967, 13.5166, 12.5836, 18.5506, 17.2993, 16.2716, 15.1871, 14.0893, 20.2538, 18.9439, 17.8862, 16.6258, 15.4145, 21.9402, 20.5803, 19.3041]
})

# 按y降序、x升序排序
sorted_data = data.sort_values(by=['y', 'x'], ascending=[False, True])

2. 分组提取独立数组

方式1:已知每条曲线点数

如果知道每条曲线的点数(比如你有5条曲线,完整数据中每条有N个点),直接按固定数量拆分:

# 假设每条曲线有7个点(根据实际数据调整N值)
N = 7
curves = [sorted_data.iloc[i*N : (i+1)*N].values.tolist() for i in range(5)]

方式2:未知点数用聚类

不确定每条曲线点数时,用KMeans按y值分成5组(对应5条曲线):

from sklearn.cluster import KMeans

# 基于y值聚类,分成5组
kmeans = KMeans(n_clusters=5, random_state=0).fit(data[['y']])
data['cluster'] = kmeans.labels_

# 按聚类结果分组,得到每条曲线的数组
curves = []
for cluster_id in sorted(data['cluster'].unique()):
    curve_points = data[data['cluster'] == cluster_id].sort_values(by='x').values.tolist()
    curves.append(curve_points)

3. 为点分配从左到右的编号

对每个分组后的曲线,按x值升序排序(保证从左到右),然后给每个点分配0到对应曲线最大序号的编号:

labeled_curves = []
for curve in curves:
    # 按x升序排序,确保顺序是从左到右
    sorted_curve = sorted(curve, key=lambda p: p[0])
    # 为每个点添加编号,格式为[编号, x, y]
    labeled_curve = [[idx, p[0], p[1]] for idx, p in enumerate(sorted_curve)]
    labeled_curves.append(labeled_curve)

关键提醒

  • 不要直接用x+y排序,不同曲线的x+y值可能重叠,导致分组错误;按y值区间分组+升序排x是更稳妥的方案,因为你的曲线呈现明显的“分层”特征。
  • 内侧曲线可通过聚类后的最小y值组直接提取,对应labeled_curves中排序后的最后一组。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:40:48