2017-02-16 6 views
0

pandas.dataframe.duplicatedは、データフレーム内の指定された列全体で重複する行を検索するのに最適です。パンダを使用してメモリより大きいデータセットの重複行を取得する

しかし、私のデータセットは、メモリに収まるものよりも大きく(妥当な予算の範囲内で拡張した後に収まるものよりもさらに大きい)。

これは、データセット(csvとdbfファイル)をループして、各ファイルをそれ自身のメモリにロードしてすべてを順番に実行できるので、実行する必要のある解析のほとんどで問題ありません。ただし、重複分析では、データセット全体で重複を検出するのには適していませんが、単一ファイル内でのみ重複を検出することはできません。

複数のデータフレームにわたって重複を検出し、それらをすべて同時にメモリにロードする必要がないアルゴリズムまたはアプローチはありますか?

+0

どの行の値をハッシュし、重複したハッシュ値を探してはどうですか? – AndreyF

答えて

1

私は2つのことを示唆します。 可能であれば、データフレームをrdbmsにロードすることです。 次に、キー列をグループ化して重複を見つけることができます。

第2に、大きなファイルからキー列のみを抽出し、これらを互いに比較します。

ファイル内のキー列を基準に行をソートすると、ある行と次の行を比較するだけで重複を検出できます。

希望に役立ちます。

1

あなたは、「キー」列の値をハッシュし、すでに遭遇したハッシュコードのセットを維持することができます。

import hashlib 

hash_set = set() # this will contain all the hash codes of rows seen 

def is_duplicate(row): 
    m = hashlib.md5() 
    for c in ["column1", "column2", "column3"]: 
     m.update(row[c]) 
    hash_code = m.digest() 
    if hash_code in hash_set: 
     return 1 
    hash_set.add(hash_code) 
    return 0 

for df_path in [df1_path, df2_path, df3_path]: # iterate dataframes 1 by 1 
    df = pd.read_csv(df_path) # load the dataframe 
    df["duplicate"] = df.apply(is_duplicate, axis=1) 
    unique_df = df[df["duplicate"]==0] # a "globaly" unique dataframe 
    unique_df.pop("duplicate") # you don't need this column anymore 
    # YOUR CODE... 
関連する問題