【问题标题】:How to Cluster Pandas Dataframe Rows by Fuzzy Matched String?如何通过模糊匹配字符串对 Pandas 数据帧行进行聚类?
【发布时间】:2017-04-03 15:36:23
【问题描述】:

我有一个包含 ID、名称和地址的 DataFrame。我想通过亲和力传播或其他算法对地址进行聚类,以便对地址字符串进行模糊匹配/分组。这部分我有:

import pandas as pd
import pyodbc
import numpy as np
from sklearn.cluster import AffinityPropagation
from pyjarowinkler import distance
from sklearn import metrics

conn = pyodbc.connect(r'DSN=<UserDSN>;')
df = pd.read_sql('select * from <InputTable>', conn)

addr = df['Addresses']
addr = np.asarray(addr)

jw = np.array([[distance.get_jaro_distance(w1,w2) for w1 in addr] for w2 in addr])

affprop = AffinityPropagation(affinity="precomputed", damping=.5)
affprop.fit(jw)

for cluster_id in np.unique(affprop.labels_):
    exemplar = addr[affprop.cluster_centers_indices_[cluster_id]]
    cluster = np.unique(addr[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:* %s" % (exemplar, cluster

现在,如何通过在 DataFrame 中使用“集群”列来使这种集群变得有用?本质上,我想将每个集群的 exemplar 添加回 DataFrame 中的相应行。我是否需要某种唯一 ID 才能做到这一点?这样做的目的是识别数据中的重复行,因此目前没有唯一 ID。但是,也许我可以以某种方式在原始 DataFrame 中添加一个,因为每一行作为一个整体都是唯一的?

感谢大家提供的任何见解!

【问题讨论】:

    标签: python pandas scikit-learn fuzzy-logic


    【解决方案1】:
    df['new_col'] = list(affprop.labels_)
    

    【讨论】:

    • 请记住在回答问题时包含解释,而不是简单地提供代码。这将确保此答案对不熟悉此语法的人有用——我们可能会假设,这些人将是遇到此类问题的同一个人。您可以编辑您的答案以提供有关此功能的一些详细信息吗?
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多