2017-02-12 13 views
0

私はpandasカラムを読み込んでそのユニークな値を辞書に書き込み、その値を整数にマッピングします。辞書に書き込むPythonは大量のデータをタイムアウトします

問題は、計算が非効率的で、完了する前に常に殺されるということです。 私は165個のそのような列と30万行以上の列を持っています。

例:

my pandas dataframe df: 
A  B 
cat lion 
dog tiger 
cat tiger 

my output dictionary: 
dict['A'] = {'cat':1,'dog',2} 
dict['B'] = {'lion':1,'tiger',2} 

が働くが、完了にそれを作ることはありませんextrememly遅いコード:ターミナルで

not_num_cols = ['A','B'...] 

def replace_str(col_lists): 
    my_dict = {} 
    for c in col_lists: 
     c_unique = df[c].unique() 
     my_dict[c] = dict(zip(c_unique,range(len(c_unique)))) 
     df[c] = df[c].replace(my_dict[c]) 
    return my_dict 

my_dict = replace_str(not_num_cols) 

、プログラムが自動的にいくつかの時間のために実行した後に殺されます。

このコードのメモリをより効率的にするにはどうすればよいですか?

+0

おそらくあなたのプロセスはOOMによって殺されるでしょうか? – BlackBear

答えて

0

あなたは(因数分解)を分類するように見え、すべての非数値列:

In [15]: df 
Out[15]: 
    ID A  B 
0 11 cat lion 
1 12 dog tiger 
2 13 cat tiger 

In [16]: for col in not_num_cols: 
    ...:  df[col] = pd.factorize(df[col])[0] 
    ...: 

In [17]: df 
Out[17]: 
    ID A B 
0 11 0 0 
1 12 1 1 
2 13 0 1 
0

あなたはチャンクサイズであるかを決めることができる場所あなたがチャンクに、この方法はそれを行うことができ、たとえば小さなものにあなたの巨大なデータフレームを、分割することができます:

def splitDataFrameIntoSmaller(df, chunkSize = 10000): 
    listOfDf = list() 
    numberChunks = len(df) // chunkSize + 1 
    for i in range(numberChunks): 
     listOfDf.append(df[i*chunkSize:(i+1)*chunkSize]) 
    return listOfDf 

あなたはチャンクを持った後、あなたがreplace_strを適用することができます各チャンクの機能を別々に(名前は正直に言うと、本当に良いではありません)

0

全体replace_str機能を置き換えることができます。

import pandas as pd 

def replace_str(col): 
    return {integer: value_in_df 
      for integer, value_in_df in enumerate(df[col].unique(), 1)} 

df = pd.DataFrame({'a': ['cat', 'dog']}) 

print(replace_str('a')) 
# {1: 'cat', 2: 'dog'} 
関連する問題