Pandasで複数のCSVファイルをまとめて一度に読み込んで一つのデータフレームに結合する簡単な方法【Python/テクニック/小技】
目次
こんにちは。
今回はちょっとしたPython/Pandasのテクニックをご紹介します。
複数の同じ構造のファイルを同時に読み込んで、一つのデータフレームに結合したいときがたまにあります。
そんなときに役立つ、ちょっとこなれた感じのする方法です。
【やりたいこと】複数の同じ構造のCSVファイルを1つにまとめたい
たとえば次のような2つの同じ構造のCSVがあった場合。左がtest0.csv
、右がtest1.csv
で、それぞれid
とname
を持っています。
これらを縦に結合したデータフレームを作成したいときを考えます。
一番基本的な方法は、次のように、それぞれのCSVをデータフレームに読み込んでから、データフレームを結合します。
df0 = pd.read_csv('test0.csv') # CSV読み込み
df1 = pd.read_csv('test1.csv') # 同上
df_concat = pd.concat([df0,df1]) # データフレームを縦に結合
まあこれでも簡単なんですが、結合したいCSVファイルの数が10個とかになってくると面倒ですよね。
【簡単に記述する方法】for文でリストに入れて中身を結合する
そこで複数ファイルに同じ処理を繰り返す、ということでfor文を使うことを思いつきます。
for文の結果を格納しておくのは、それぞれの変数を作るよりも、リストを使うのが一般的です。
Pythonのリストにはデータフレームを要素として格納しておくこともできるので、これを利用します。(リストよりもデータフレームのほうが大きそうなイメージがあるので、感覚に反するかもしれませんね。)
l = [] # データフレームを格納する空のリストを作成
for i in range(2): # for文でファイル数だけ繰り返す
filepath = f'test{i}.csv' # ファイル名を動的に定義
df = pd.read_csv(filepath) # CSV読み込み
l.append(df) # リストにデータフレームを追加
df_concat = pd.concat([l[0],l[1]]) # リストの要素を縦に結合
このように繰り返し処理をすることで、ファイルの数が増えても記述しやすくなりました。
しかし、結合の要素を一つ一つ書くのは大変ですよね。
pd.concat()
で結合するデータフレームはリスト形式[]
で渡すことに注目すると、実はこの中にfor文を内包表記できるということに気づきます。
df_concat = pd.concat([l[i] for i in range(2)])
# [] がなくてもいける
df_concat = pd.concat(l[i] for i in range(2))
ん? ということはこの中でファイルの読み込みも繰り返し処理できるのでは...?ということに気づくと、もっとシンプルに書くことができるようになります。
【さらに簡単な方法】リスト内包表記とconcatを組み合わせる
上記の内包表記を利用して、ファイルの読み込みもpd.concat()
の中に書いてしまいましょう。
df_concat = pd.concat(
pd.read_csv(f'test{i}.csv') for i in range(2)
)
なんと1文で書けてしまいました。ファイルが100個でもこの1文で1個のデータフレームにまとめることができます。
ついでにindexもリセットしておきましょう。
df_concat = pd.concat(
pd.read_csv(f'test{i}.csv') for i in range(2)
).reset_index(drop=True)
このように、綺麗に一つのデータフレームにまとめることができました。
まとめ
というわけで、今回は複数の同じ構造のCSVファイルをまとめて1つのデータフレームに格納するのに簡単な方法をご紹介しました。
リストの内包表記を使いこなせると、よりPythonらしくシンプルに記述できるようになるのでいい感じですね。
PythonやPandasの基本的なテクニックはこちらの書籍がわかりやすくまとまっていてオススメです。
Pythonデータサイエンスハンドブック ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習 単行本(ソフトカバー) –ご参考になれば幸いです。
それでは〜
関連記事
Pandas DataFrameの値を条件検索して書き換える方法色々 ~ mask/where/replace【python/データ加工】