「1251」で終わるフォルダに3つのCSVファイルがあります。フォルダを繰り返し処理し、これらのファイルを選択して、パンダのデータフレームにチャンクでロードし、選択した列とマージしたいと思います。
90MBのファイルは簡単ですが、スクリプトは700 MBのファイル(300万行以上)を追加するのに15分かかります。操作全体が完了するまでに20分かかります-これは受け入れられません。
手順を変更して加速する方法はありますか?つまり、CSVをパンダのデータフレームにチャンクでロードし、それらを1つのファイルにマージ/追加/連結します。
これは小さなファイルではうまく機能しますが、大きなcsvファイルではより高速である必要があります。良いアイデアの質問をたくさん見つけましたが、これはうまくいくはずです-なぜそんなに遅いのかわかりません。それを速くする方法はありますか?
import os
import sys
import struct
import fileinput
import csv
import pandas as pd
cwd = 'C:\\Users\\'
print(cwd)
directory = (cwd + '\\FINAL\\')
directory2 = (cwd + '\\FINAL\\CSV')
print(directory)
x=pd.DataFrame()
for file in os.listdir(directory):
if file.endswith( "1251.csv"):
fajl = os.path.splitext(file)[0]
print(fajl)
for chunk in pd.read_csv(directory + '\\' + fajl + ".csv", sep=",",error_bad_lines=False, encoding='latin-1',low_memory=False, chunksize=100000):
mylist = []
mylist.append(chunk)
big_data = pd.concat(mylist, axis= 0)
big_data = big_data.fillna(value='')
selected = big_data[['SYS', 'MANDT', 'AGR_NAME', 'OBJECT', 'AUTH', 'FIELD', 'LOW', 'HIGH', 'DELETED']]
x=x.append(selected)
x.to_csv(directory2 + '\\' + fajl + '.csv', sep=',', index=False)
コードにいくつか問題があると思います。
何らかの理由で、2番目のforループ内でリストを再初期化しています。本質的に、このコードはデータフレームを追加する以外に何もしていません。
for chunk in pd.read_csv(directory + '\\' + fajl + ".csv", sep=",",error_bad_lines=False, encoding='latin-1',low_memory=False, chunksize=100000):
mylist = []
mylist.append(chunk)
big_data = pd.concat(mylist, axis= 0)
big_data = big_data.fillna(value='')
selected = big_data[['SYS', 'MANDT', 'AGR_NAME', 'OBJECT', 'AUTH', 'FIELD', 'LOW', 'HIGH', 'DELETED']]
x=x.append(selected)
パンダがあなたのcsvを処理できると仮定すると(各csvの大きさはあなたの投稿からは明らかではありません)、私はこれを次のように行います(複数のDataFrameを含むリストにpd.concatを使用すると、追加よりもはるかに効率的です):
import csv
import pandas as pd
cwd = 'C:\\Users\\'
print(cwd)
directory = (cwd + '\\FINAL\\')
directory2 = (cwd + '\\FINAL\\CSV')
print(directory)
my_list = []
for file in os.listdir(directory):
if file.endswith( "1251.csv"):
fajl = os.path.splitext(file)[0]
print(fajl)
curr_df = pd.read_csv(directory + '\\' + fajl + ".csv", sep=",",error_bad_lines=False, encoding='latin-1', usecols=['SYS', 'MANDT', 'AGR_NAME', 'OBJECT', 'AUTH', 'FIELD', 'LOW', 'HIGH', 'DELETED'])
curr_df = curr_df.fillna(value='')
my_list.append(curr_df)
x = pd.concat(my_list)
x.to_csv(directory2 + '\\' + fajl + '.csv', sep=',', index=False)
あなたが本当にチャンクで読む必要があると仮定します:
import os
import sys
import struct
import fileinput
import csv
import pandas as pd
cwd = 'C:\\Users\\'
print(cwd)
directory = (cwd + '\\FINAL\\')
directory2 = (cwd + '\\FINAL\\CSV')
print(directory)
x = []
for file in os.listdir(directory):
if file.endswith( "1251.csv"):
fajl = os.path.splitext(file)[0]
print(fajl)
for chunk in pd.read_csv(directory + '\\' + fajl + ".csv", sep=",",error_bad_lines=False, encoding='latin-1',low_memory=False, chunksize=100000):
x.append(chunk['SYS', 'MANDT', 'AGR_NAME', 'OBJECT', 'AUTH', 'FIELD', 'LOW', 'HIGH', 'DELETED'])
big_data = pd.concat(x, axis=0)
big_data = big_data.fillna(value='')
big_data.to_csv(directory2 + '\\' + fajl + '.csv', sep=',', index=False)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加