2016-12-16 5 views
0

複数の.txtファイルがあります。私は、インポートされ、約20ファイルをインポートし、データフレームを形成するために〜19秒かかります高速化する方法/ .txtファイルを使用して形成されたpythonデータフレームのフィルタリング?

all_files = glob.glob(os.path.join(path, "*.txt")) 

np_array_list = [] 
for file in all_files: 
    df = pd.read_table(file, index_col = None, header = 0) 
    np_array_list.append(df.as_matrix()) 

comb_np_array = np.vstack(np_array_list) 
big_frame = pd.DataFrame(comb_np_array) 

を使用してPythonのデータフレームを形成するために、それらを組み合わせています。それを行うより速い方法がありますか?

第2に、 データフレームが形成されると、それには約800万行が含まれます。私は第五列の値

私は、次のコードであること達成しています

「とは、その長さが12であり、彼らが 『26』で始まる値」の基準を使用して行をフィルタする必要があります。

big_frame.columns = ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"] 

big_frame['Five'] = big_frame['Five'].astype('str') 

mask = (big_frame['Five'].str.len() == 12) & (big_frame['Five'].str.startswith('26')) 

big_frame = big_frame.loc[mask] 

私の条件に一致するすべての値を除外するには、時間がかかります。私はただ1つの.txtファイルでコードを検証しました。 〜3秒ですべての処理を行います。

しかし、できるだけ早くすべてのファイルを処理する必要があります。それを行うためのより良い方法は?データフレームの構築に

答えて

1

一つの可能​​な解決策は、一緒に第一のフィルタと、その後concatですが、パフォーマンスは、実際のデータに依存:

all_files = glob.glob(os.path.join(path, "*.txt")) 

dfs = [] 
for file in all_files: 
    df = pd.read_csv(file, index_col = None, header = 0) 
    df.columns = ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"] 
    mask = (df['Five'].str.len() == 12) & (df['Five'].str.startswith('26')) 
    dfs.append(df[mask]) 

big_frame = pd.concat(dfs, ignore_index=True) 
+0

おかげで、それは多くを助けました。 –

+0

計算時間が〜1分に短縮されました。私はそれが公正だと思う、それは私のために働く。あなたの応答を感謝します。 –

+0

うれしいことに、うれしいよ! – jezrael

0

、あなたは...当時の行列への変換後、データフレームを作成しているように見える、それは第二のトピックに関するdataframe.append機能(http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html

パンダを使用するかもしれない速いですかどうかを確認します - len列と最初の2つのchar列を作成し、それをフィルタリングすると役立ちますか?もう一つの条件よりもはるかに強い条件もありますか?計算上の問題以上にメモリ管理の問題のように思えます。

関連する問題