如何用Pandas按坐标范围分组并统计合并行数与最大强度?
解决方法
步骤1:展开嵌套坐标
首先得把每个单元格里的嵌套坐标拆成单独行,才能逐个处理坐标。用explode就能轻松实现,它会把列表里的每个元素拆成独立行,同时保留对应的强度值:
import pandas as pd from sklearn.cluster import DBSCAN # 示例数据 df = pd.DataFrame({ 'intensity': [620,650,650,700,90], "coordinates":[[[30,22]],[[30,23],[29,28]],[[30,23],[29,28]],[[27,28]],[[26,26]]] }) # 展开坐标列 expanded_df = df.explode('coordinates', ignore_index=True)
展开后的expanded_df结构如下:
intensity coordinates 0 620 [30, 22] 1 650 [30, 23] 2 650 [29, 28] 3 650 [30, 23] 4 650 [29, 28] 5 700 [27, 28] 6 90 [26, 26]
步骤2:提取坐标的x、y值
把坐标列表拆成单独的x和y列,方便后续计算距离:
expanded_df[['x', 'y']] = pd.DataFrame(expanded_df['coordinates'].tolist(), index=expanded_df.index)
步骤3:用DBSCAN聚类分组
要把x、y差值小于3的坐标归为一组,用DBSCAN聚类最适合——它能根据距离自动把相近的点划到同一簇。设置eps=3(欧氏距离小于3的点归为一类),min_samples=1(单个点也能成簇):
# 准备坐标数据 coords = expanded_df[['x', 'y']].values # 初始化DBSCAN并拟合 dbscan = DBSCAN(eps=3, min_samples=1) expanded_df['cluster'] = dbscan.fit_predict(coords)
此时expanded_df会新增cluster列,同一簇的坐标会有相同的编号。
步骤4:分组统计并取最大强度
按簇分组,统计每个簇的坐标数量(amount),同时取该簇的最大强度值:
result = expanded_df.groupby('cluster').agg( intensity=('intensity', 'max'), amount=('coordinates', 'count') ).reset_index(drop=True)
最终结果
运行完上述代码,result就是你需要的输出:
intensity amount 0 650 3 1 700 4
其中第一个簇包含[30,22], [30,23], [30,23],第二个簇包含[29,28], [29,28], [27,28], [26,26]。
内容的提问来源于stack exchange,提问作者sokkers1193
相关产品推荐
相关产品推荐

