(Python) Pandas - GroupBy() 使用相似性函数



我正在使用Pandas在Python中使用csv文件。 我在思考如何实现以下目标时遇到了一些麻烦。 我需要实现的是使用相似性函数对条目进行分组。 例如,每个组 X 应包含组中的每个配对在某个属性列值上最多 Y 不同的所有条目。

给定以下 CSV 示例:

<pre>
name;sex;city;age
john;male;newyork;20
jack;male;newyork;21
mary;female;losangeles;45
maryanne;female;losangeles;48
eric;male;san francisco;29
jenny;female;boston2;30
mattia;na;BostonDynamics;50
</pre>

考虑到年龄列,此值最多相差 3,我将得到以下组:

A = {john;male;newyork;20
jack;male;newyork;21}
B={eric;male;san francisco;29
jenny;female;boston2;30}
C={mary;female;losangeles;45
maryanne;female;losangeles;48}
D={maryanne;female;losangeles;48
mattia;na;BostonDynamics;50}

实际上这是我的解决方法,但我希望存在一些更pythonic的东西。

import pandas as pandas
import numpy as numpy
def main():
csv_path = "../resources/dataset_string.csv"
csv_data_frame = pandas.read_csv(csv_path, delimiter=";")
print("nOriginal Values:")
print(csv_data_frame)
sorted_df = csv_data_frame.sort_values(by=["age", "name"], kind="mergesort")
print("nSorted Values by AGE & NAME:")
print(sorted_df)
min_age = int(numpy.min(sorted_df["age"]))
print("nMin_Age:", min_age)
max_age = int(numpy.max(sorted_df["age"]))
print("nMax_Age:", max_age)
threshold = 3
bins = numpy.arange(min_age, max_age, threshold)
print("Bins:", bins)
ind = numpy.digitize(sorted_df["age"], bins)
print(ind)
print("nnClustering by hand:n")
current_min = min_age
for cluster in range(min_age, max_age, threshold):
next_min = current_min + threshold
print("<Cluster({})>".format(cluster))
print(sorted_df[(current_min <= sorted_df["age"]) & (sorted_df["age"] <= next_min)])
print("</Cluster({})>n".format(cluster + threshold))
current_min = next_min

if __name__ == "__main__":
main()

在一个属性上,这很简单:

  1. 排序
  2. 线性扫描数据,每当超出阈值时,开始一个新组。

虽然这不会是最佳的,但它应该比你已经拥有的更好,而且成本更低。

然而,在多元情况下,找到最优组应该是NP困难的,因此找到最优分组将需要在指数时间内进行暴力搜索。因此,您需要通过AGNES(以O(n³(为单位(或CLINK(通常质量较差,但O(n²((来近似

。由于这相当昂贵,因此它不会是数据框的简单运算符。

相关内容

最新更新