web-dev-qa-db-ja.com

フォルダーの複数のcsvファイルを1つのデータフレームにロードする

同じ列レイアウトの1つのフォルダーに複数のcsvファイルを保存していて、それをパンダのデータフレームとしてpythonにロードしたい。

質問はこれに本当に似ています thread。

次のコードを使用しています。

import glob
import pandas as pd
salesdata = pd.DataFrame()
for f in glob.glob("TransactionData\Promorelevant\*.csv"):
    appenddata = pd.read_csv(f, header=None, sep=";")
    salesdata = salesdata.append(appenddata,ignore_index=True)

別のパッケージでそれのためのより良い解決策はありますか?

これには時間がかかります。

ありがとう

6
PV8

concat でリスト内包表記を使用することをお勧めします:

import glob
import pandas as pd

files = glob.glob("TransactionData\Promorelevant*.csv")
dfs = [pd.read_csv(f, header=None, sep=";") for f in files]

salesdata = pd.concat(dfs,ignore_index=True)
2
jezrael

多分bashを使う方が速いでしょう:

head -n 1 "TransactionData/Promorelevant/0.csv" > merged.csv
tail -q -n +2 TransactionData/Promorelevant*.csv >> merged.csv

または、jupyterノートブック内から使用する場合

!head -n 1 "TransactionData/Promorelevant/0.csv" > merged.csv
!tail -q -n +2 "TransactionData/Promorelevant*.csv" >> merged.csv

何も解析する必要がないという考えです。

最初のコマンドは、ファイルの1つのヘッダーをコピーします。ヘッダーがない場合は、この行をスキップできます。 Tailはすべてのファイルのヘッダーをスキップし、csvに追加します。

Pythonでの追加はおそらくより高価です。

もちろん、パンダを使用して解析がまだ有効であることを確認してください。

pd.read_csv("merged.csv")

ベンチマークに興味があります。

1
PascalVKooten

私は、時間機能付きのbashを除くすべてのこのアプローチをチェックしました(1回の実行のみ、およびファイルが共有ドライブ上にあることにも注意してください)。

結果は次のとおりです。

私のアプローチ:1220.49

リストcomphrension + concat:1135.53

concat + map + join:1116.31

リストcomphrension + concatを使用すると、数分節約でき、かなりなじみがあります。

あなたのアイデアをありがとう。

0
PV8

実際の回答へのリンク の助けを借りて

これは最高のライナーのようです:

import glob, os    
df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "*.csv"))))
0
Muhammad Haseeb