2017-08-06 12 views
-1

私はPandasを使ってPythonでcsvファイルを扱っています。 私は次の目標を達成する方法を考えているいくつかの問題を抱えています。 私が達成する必要があるのは、類似性機能を使用してエントリをグループ化することです。 たとえば、各グループXには、グループ内の各カップルが、特定の属性列値で最大でもYと異なるすべてのエントリを含める必要があります。(Python)類似性関数を使ったPandas - GroupBy()

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} 
:私は次のグループになるだろう、この値に高々3の違いで、

<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>

と年齢の列を考慮:

は、このCSVの例を考えます

これは私の回避策ですが、私はもっと無愛想なものが存在することを願っています。一つの属性で

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("\n\nClustering 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() 
+0

私はあなたがパンダでそれをすることはできないと確信しています。あなたはsklearnのクラスタリングアルゴリズムを使用してみませんか? k-means? sklearnによって計算されたクラスタリングインデックスを取得したら、簡単にグループ化することができます。 –

+0

私はクラスターの数を知る必要があると私はそれを計算した方法を考えることができないことを読んだことがあるので、データはクラスタの割合でランダムに分散することができます。それらが均等に分散されていれば(少なくともクラスターごとに1回)、math.ceil((max-min)/ threshold)クラスターが得られます。 k-meansで対応するクラスタにデータを正しく挿入することは可能ですか?少しの例が非常に役に立つでしょう。私はこれについて調べるつもりです。どうもありがとう。 –

答えて

1

これは単純です:

  1. ソート
  2. 直線のデータをスキャンし、しきい値に違反するたびに、新しいグループを開始します。

これは最適ではありませんが、これは既存のものよりも安価であるはずです。

しかし、多変量の場合、最適なグループを見つけるのはおそらくNPハードであるため、最適なグループ分けを見つけるには指数関数的な時間でのブルートフォース検索が必要です。したがって、AGNES(O(n³))またはCLINK(通常は悪化しますが、O(n²))のいずれかでこれを近似する必要があります。

これはかなり高価なので、データフレームの単純な演算子ではありません。

関連する問題