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
相关产品推荐
相关产品推荐

