gpt4 book ai didi

python - 如何基于数组从 (geo)pandas 数据框中选择多行或传播聚类算法结果的元数据?

转载 作者:行者123 更新时间:2023-12-01 08:49:58 24 4
gpt4 key购买 nike

我有一个 geopandas 数据框,其中包含多边形、region_id 和 center_point 纬度和经度(以弧度表示),如下所示:

enter image description here

然后我想根据每个区域的中心点对每个区域进行聚类,并执行以下操作:

#Set Up
kms_per_radian = 6371.0088
eps = 0.1/kms_per_radian
coords = blocks_meta.as_matrix(columns=['lat', 'lon'])

#Cluster
from sklearn.cluster import DBSCAN

db = DBSCAN(eps=epsilon, algorithm='ball_tree', metric='haversine', min_samples=1).fit(coords)
labels = db.labels_
clusters = pd.Series([coords[labels == n] for n in range(len(set(labels)))])

这会产生一个中心点簇数组,如下所示。

array([[ 0.0703843 ,  0.170845  ],
[ 0.07037922, 0.17084981],
[ 0.07036705, 0.17085678],
[ 0.0703715 , 0.17083775]])

我正在努力弄清楚如何做是获取与每个集群关联的regions_ids以合并多边形以创建一个更大的区域,而无需循环遍历每个集群以及每个经纬度对并查询数据帧。

有没有办法传播 id 或查询每个集群的数据帧?

如有任何帮助,我们将不胜感激。

谢谢!

编辑

我想避免这样做:

clusters_of_regions = []

for cluster in clusters:
cluster_of_regions_ids = []
for entry in cluster:
print(cluster[0][0])
region_id = blocks_meta.loc[blocks_meta['lat'] == cluster[0][0]]['region_id'][1]
cluster_of_regions_ids.append(region_id)
clusters_of_regions.append(cluster_of_regions_ids)

两者都是为了避免嵌套的 for 循环 - 每当我尝试时,我都会不断收到关键错误:

有没有一种方法可以使用中心点作为属性来对区域本身进行聚类。

谢谢

最佳答案

查看 skleanr ( https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html ) 中的示例。我在这里修改了它以拥有一个数据框并类似于您的示例。

from sklearn.cluster import DBSCAN 
import pandas as pd
import numpy as np

X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])

df = pd.DataFrame(X, index=list(range(len(X))), columns = ['col1', 'col2'])

clustering = DBSCAN(eps = 3, min_samples = 2).fit(df)
labels = clustering.labels_

df = df.merge(pd.Series(labels).to_frame().rename(columns={0:'clusters'}), left_index = True, right_index = True, how = 'outer')

df

给你:

        col1    col2    clusters
0 1 2 0
1 2 2 0
2 2 3 0
3 8 7 1
4 8 8 1
5 25 80 -1

根据描述:

labels_ : array, shape = [n_samples] Cluster labels for each point in the dataset given to fit(). Noisy samples are given the label -1.

在该示例中,您将获得两个组(标签 0 和 1)。 -1 是一个“嘈杂”样本,这里的样本明显比其他样本大。

如果您执行类似的操作,您可以将您的regions_id和标签放在一起,并比较是否存在1:1关系。

关于python - 如何基于数组从 (geo)pandas 数据框中选择多行或传播聚类算法结果的元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53169521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com