2016-08-29 4 views
0

ディレクトリに複数のCSVファイルがあります。いくつかの列にはさらに多くの列が含まれています(ドロップすると問題ありません)。さまざまな列の複数のCSVファイルのレコードを重複排除する

これらのCSVファイル間でレコードを重複排除し、共通の列に縮小する優雅な方法はありますか?

現在、私はこれを達成するためにpython/pandasを使用します。すべてのファイルを1つのデータフレームにロードし、レコードが(filename)に由来する追加の列に書き留め、追加の列を削除してから最後にhttp://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.duplicated.html を使用してパンダの重複排除を行います。ディスクはfilename-identifierカラムに基づいています。

# ASSUMPTION: files are in order, first file defines minimum common columns 
path = '.' 
files_in_dir = [f for f in os.listdir(path)if f.endswith('csv')] 
isFirst = True 

for filenames in fs.find('*.csv', path): 
    df = pd.read_csv(filenames, error_bad_lines=False) 
    df['origin'] = fs.add_suffix(filenames, '_deduplicated') 
    if (isFirst): 
     isFirst = False 
     bigDf = df 
    else: 
     bigDf = pd.concat(bigDf, df, axis=0, join='inner') 
cols_for_dup = [col for col in bigDf.columns if col not in ['origin']] 
bigDf.duplicated(subset=cols_for_dup).sum() 
bigDf.duplicated().sum() 
bigDf_withoutNA = bigDf.drop_duplicates(keep='first', subset= cols_for_dup) 

grouped = bigDf_withoutNA.groupby('origin') 
for name, group in grouped: 
    #filename = 'path' + name 
    group.to_csv(path_or_buf= name, sep=';', decimal=',') 

もっと簡単な方法がありますか?

+1

データフレーム構造の例やファイルの内容を表示すると便利です。 –

+0

が私のアプローチを追加しました。 –

答えて

1

私はそれをより簡単にする方法は知られていません。私は、私のいくつかのデータのために行われた等しいスクリプトを持っています。これは2回実行され、最初はすべてのドキュメントの最小/最大のcolを決定し、最後にcsvファイルを新しいフォルダに書き換えて元のデータを保持します。

私はPythonのcsv libを使用しています。 https://docs.python.org/2/library/csv.html

このスクリプトにはチェックがありません。クイックで汚れたスクリプトです。

重複排除は行われません。すべてのデータを同じ長さにカットするだけですが、最後の行を重複排除コードに置き換えることができます。

import os 
import csv 

mincols = 0xffffffff 
maxcols = 0 

srcdir = '/tmp/csv/' 
dstdir = '/tmp/csv2/' 

for dirName, subdirList, fileList in os.walk(srcdir): 
    for fname in fileList: 
     if fname[-4:].lower() == '.csv': 
      with open(os.path.join(dirName, fname)) as csvfile: 
       reader = csv.reader(csvfile, delimiter=',', quotechar='"') 
       for row in reader: 
        if mincols > len(row): 
         mincols = len(row) 
        if maxcols < len(row): 
         maxcols = len(row) 

print(mincols, maxcols) 

for dirName, subdirList, fileList in os.walk(srcdir): 
    for fname in fileList: 
     if fname[-4:].lower() == '.csv': 
      fullpath = os.path.join(dirName, fname)  
      newfile = os.path.join(dstdir, fullpath[len(srcdir):]) 

      if not os.path.exists(os.path.dirname(newfile)): 
       os.makedirs(os.path.dirname(newfile)) 
      with open(fullpath) as csvfile: 
       reader = csv.reader(csvfile, delimiter=',', quotechar='"') 
       with open(newfile, 'w') as dstfile: 
        writer = csv.writer(dstfile, delimiter=',', quotechar='"', 
         quoting=csv.QUOTE_MINIMAL) 
        for row in reader: 
         #You can deduplicate here 
         writer.writerow(row[:mincols])     
関連する問題