Shunya Ueta

pandas を使って特定のディレクトリのCSVファイルをすべて連結して一つのCSVファイルを作成

目的

複数の同じフォーマットの CSV ファイルが特定のディレクトリに配置されており、その CSV ファイル群を一つの CSV ファイルに連結したい

今回は、Python の Pandas と pathlib を使って上記の目的を実現します。

実行環境

In [1]: import pandas as pd
In [2]: pd.__version__
Out[2]: '1.1.2
In [3]: import sys
   ...: print(sys.version)
3.8.2 (default, Jul 19 2020, 07:23:27)
[Clang 11.0.3 (clang-1103.0.32.62)]

目的となる csv ファイルは tmp ディレクトリに以下のような形式で配置されているとする

tmp
├── 1.csv
├── 2.csv
└── 3.csv

各ファイルはこのような形式で保存されています。

id  name  created
1   John  2020/09/10
2   bob   2020/09/10
3   taro  2020/09/11

以下の Python スクリプトを実行

import pathlib
import pandas as pd


def contcat_csv(f_path:str):
    # pathlibのitedir()で対象とするディレクトリのCSVファイル一覧をジェネレーターとして取得
    csvs = [pd.read_csv(str(path)) for path in pathlib.Path(f_path).glob('*.csv')]
    # そのファイル一覧をPandasで読み込んで、pd.concat()で連結してDataFrameとして返す
    return pd.concat(csvs, sort=False)

df = contcat_csv('tmp')
# 連結されたDataFrameをCSVとして保存する
df.to_csv('concat.csv', index=False)

concat.csv を確認してみると

id  name    created
1   John    2020/09/10
2   bob     2020/09/10
3   taro    2020/09/11
4   hanako  2020/09/12
1   John    2020/09/10
2   bob     2020/09/10
3   taro    2020/09/11
4   hanako  2020/09/12
1   John    2020/09/10
2   bob     2020/09/10
3   taro    2020/09/11
4   hanako  2020/09/12

無事連結された CSV を取得することができました

追記

拝見しました。for でディレクトリを走査するときは pathlib.Path.glob("*.csv")を使った方が、csv 以外のファイルが混入したときの対策になると思ったのですが、いかがでしょう https://docs.python.org/ja/3/library/pathlib.html#pathlib.Path.glob

---

関連しているかもしれない記事


📮 📧 🐏: 記事への感想のおたよりをおまちしてます。 お気軽にお送りください。 メールアドレス入力があればメールで返信させていただきます。 もちろんお返事を希望せずに単なる感想だけでも大歓迎です。

このサイトの更新情報をRSSで配信しています。 お好きなフィードリーダーで購読してみてください。

このウェブサイトの運営や著者の活動を支援していただける方を募集しています。 もしよろしければ、Buy Me a Coffee からサポート(投げ銭)していただけると、著者の活動のモチベーションに繋がります✨

#python #pandas