2017-12-08 20 views
0

特定の列の値に応じて、異なるファイルに書きたい大規模なデータフレームがあります。並列処理複数のcsvファイルへの辞書の書き込み

最初の関数は、キーが書き出すファイルであり、値は元のデータフレームのサブセットであるnumpy配列です。

def write_in_parallel(inputDict): 
    for key,value in inputDict.items(): 
     df = pd.DataFrame(value) 
     with open(baseDir + outDir + outputFileName + key + outputFileType, 'a') as oFile: 
      data.to_csv(oFile, sep = '|', index = False, header = False) 
     print("Finished writing month: " + outputFileName + key) 

関数2は、データフレームとデータフレーム自体を分割するための列値を取り、データフレームを返します。

def make_slices(files, df): 
    outlist = dict() 
    for item in files: 
     data = np.array(df[df.iloc[:,1] == item]) 
     outlist[item] = data 
    return outlist 

最終的な機能がうまくいけば、並列に、make_slicesから辞書上write_in_parallelと反復を呼び出すためにマルチプロセッシングを使用します。

def make_dynamic_columns(): 
    perfPath = baseDir + rawDir 
    perfFiles = glob.glob(perfPath + "/*" + inputFileType) 
    perfFrame = pd.DataFrame() 
    for file_ in perfFiles: 
     df = pd.read_table(file_, delimiter = '|', header = None) 

     df.fillna(missingDataChar,inplace=True) 
     df.iloc[:,1] = df.iloc[:,1].astype(str) 

     fileList = list(df.iloc[:, 1].astype('str').unique()) 

     with mp.Pool(processes=10) as pool: 
      pool.map(write_in_parallel, make_slices(fileList, df)) 

私は取得していますエラーがpool.mapとwrite_in_parallel辞書を受信して​​いないと信じて私をリード「のstrオブジェクトが属性項目がありません」です。この問題を解決する方法がわかりません。どんな助けでも大歓迎です。

multiprocessing.pool.RemoteTraceback: 
""" 
Traceback (most recent call last): 
    File "/home/ssun/library/python/Python-3.5.2/build/lib/python3.5/multiprocessing/pool.py", line 119, in worker 
    result = (True, func(*args, **kwds)) 
    File "/home/ssun/library/python/Python-3.5.2/build/lib/python3.5/multiprocessing/pool.py", line 44, in mapstar 
    return list(map(*args)) 
    File "_FHLMC_LLP_dataprep.py", line 22, in write_in_parallel 
    for key,value in dict.items(): 
AttributeError: 'str' object has no attribute 'items' 
""" 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "_FHLMC_LLP_dataprep.py", line 59, in <module> 
    make_dynamic_columns_freddie() 
    File "_FHLMC_LLP_dataprep.py", line 55, in make_dynamic_columns_freddie 
    pool.map(write_in_parallel, dictinput) 
    File "/home/ssun/library/python/Python-3.5.2/build/lib/python3.5/multiprocessing/pool.py", line 260, in map 
    return self._map_async(func, iterable, mapstar, chunksize).get() 
    File "/home/ssun/library/python/Python-3.5.2/build/lib/python3.5/multiprocessing/pool.py", line 608, in get 
    raise self._value 
AttributeError: 'str' object has no attribute 'items' 
+1

完全なスタックトレースを投稿してください – FHTMitchell

+0

トレースバックが追加されました –

答えて

1

あなたの問題はmake_slicesが辞書ではなく、リストを返すことで、pool.map()はそれを好きではありません。辞書キーをワーカーに渡すだけです。文字列であることを意味します(inputDictとして受け取ったものを印刷してみてください)。それは辞書ではなくキーです。

def make_slices(files, df): 
    outlist = [] 
    for item in files: 
     data = df + item 
     outlist.append({item: data}) 
    return outlist 

実際にリストを返すようにしてもよろしいですか?メンバーは辞書項目になります。 (テストするデータに何かを作成するためにコードを修正する必要がありました)。

このようにすれば、従業員にキーと関連データ項目を受け取ることができます。

+0

ありがとうございました。また、辞書をwrite_in_parallelで再作成する必要がありました。 def write_in_parallel(dictinput): dictinput = dict(dictinputの項目の項目) dictinput.items()のキーの値: '... –

関連する問題