注目キーワード

【Python】pandasでCSVファイルを読み込み結合する (concat)

Pythonを用いたデータ解析に便利なライブラリであるpandasを使うといろんなCSVファイルを読み込むことができます。こちらの記事では複数のCSVファイルを結合し、大きなデータとしてデータ解析を行うための処理を説明します。

データの準備

read_csv の記事で利用していたサンプルのデータを続けて利用しています。厚生労働省のページより、「PCR検査実施人数」をクリックして「pcr_tested_daily.csv」を、「PCR検査の実施人数」から「pcr_case_daily.csv」をダウンロードして利用します。

データの準備その1 (pcr_tested_daily.csv)

毎日の検査人数データが2020年2月から2022年9月まで記録されています。データ処理の例題に使うために、2020年2月と2020年3月のデータをそれぞれ作成し、CSVファイルとして保存しました(pcr_tested_daily_202002.csvpcr_tested_daily_202003.csv という名前で保存しました)。

データの準備その2 (pcr_case_daily.csv)

こちらは merge の説明で利用したデータになります。そちらの記事も合わせてご確認ください。

concatを用いてデータを縦方向に結合する

作成したデータをpandasのread_csvで読み込みした後に、結合して1つのDataFrameとして扱う処理を説明します。

concat を用いて行方向で結合する(2月のデータ+3月のデータをつくる)

concatを使用したプログラムを共有します。

サンプルコード

サンプルコードです。

データの読み込みについては read_csv の使い方を確認してください。

実行結果

下の図に実行結果を示します。

読み込んだデータフレームのサイズと、入力の2つのデータフレームを結合して3つ目のデータフレームを作成し、3つのデータフレームの概要を describe() で確認した結果

2つの列名情報が揃っているデータフレームを用意したので、2つのデータフレームをconcatすると、2月と3月のデータが格納された結果が得られます。

結合時のインデックスを確認する

先程の処理を行ったとき、データフレームの各行に付与されている index が混ざることに注意してください。df12.index を出力することで index を確認できます。これは2月のデータが25日分、3月のデータが31日分だったので、それぞれ0〜24と0〜30の index が付いていたためです。結合したデータに新しく 0行目〜55行目までの index を振り直すには、concatの引数の1つである ignore_index に True を渡します。

インデックスを確認するサンプルコード

データフレームのインデックスは index で取得することができます。取得したインデックスをpythonのリストにして出力してみます。

実行結果

実行結果を確認します。


1行目はインデックスの処理をしない場合の結果です。2つのデータフレームのインデックスが混ざって設定されていることが分かります。

2行目は ignore_index=True としてインデックスを振り直した結果です。0から55まで順番にインデックスが付与されたことが分かります。

concat を用いて列方向(横方向)で結合する(国立感染症研究所のデータ+他機関のデータをつくる)

mergeの記事でサンプルを確認した通り、データフレームの結合には横方向(列を増やす)と縦方向(行を増やす)があります。concat は複数のデータフレームを両方向に柔軟に結合することができます。ここでは列方向にデータを増やす例を実装してみます。

サンプルコード

concat を実行するサンプルコードです。

実行結果(その1)

上のコードを実行すると次の結果が得られます。

concatの実行例その1

期待した結果とは異なる結果になりましたね。これは concat がデフォルトでは縦方向に行を追加しようとするためです。ここでは横方向に列を追加したいので、追加する軸 axis を指定します(2次元の場合には縦方向がaxis=0、横方向がaxis=1です)。以下は axis=1 を指定するサンプルコードです。

スポンサーリンク

サンプルコード(axis指定版)

以下がサンプルコードです。

実行結果(axis指定版)

横方向の結合を指定したので、うまく結合されました。

axis=1を指定した結合した例

ただし日付が2重に記録されていることがわかります。これは両方のデータフレームから日付の列を持ってきて結合しているためです。

日付をインデックスに指定して結合するサンプルコード

最後に上の問題を解決する1つの方法として、数値のインデックス(0、1、…)ではなく日付をインデックスと設定することで、重複を取り除いてみます。データフレーム読み込みの際に0列目(日付)をインデックスに使用するように設定した上で、concatを用いて横方向に結合します。

日付をインデックスに指定した実行結果

実行結果を確認します。

インデックスに日付を用いて結合した例

望んだ結果が得られました。

データの読み込み・結合はpandasを使う際に大変よく利用する機能になります。結合方法にも細かいパラメータがたくさんありますので、一度ドキュメントを確認してみてください。

また自分の興味のあるデータを実際に読み込んだり、結合や集計を行うことで理解が深まると思います。一度使ってみてくださいね