【Python入門】複数csvファイルからデータ取得、別名自動保存~format利用~

複数のデータファイルからあるデータを抽出して、抽出したデータごとに新たなファイルとしてまとめたいことはありませんか?

本記事は、複数csvファイルからデータを抽出して、データごとに新しいcsvファイル名で出力したい方におすすめの内容です。

本記事を読むと、”pandas”ライブラリとformat文を使用して

  • 複数のcsvファイルから同じ行列データを抽出
  • 複数のcsvファイルから抽出したデータごとに自動で新しいcsvファイル名として保存

ができるようになります。これをマスターすれば、大量のデータ処理することが可能になるのでぜひ御覧ください。

0. 使用環境

  • OS: Windows10 Pro
  • Visual Studio Code: Version 1.47.0
  • Python: Version 3.7.6 (64bit)
  • pandas: Version 1.0.1

1. データ解析の全体図

本記事のデータサイエンスの紹介範囲を示します。

データサイエンスは主に5つのステージがあります。(図のようにステージを飛ばす場合もあります。図は一例です。)

  1. データ収集(データを集めて処理できる準備をする)
  2. データの前処理(データを格納もしくはデータを解析しやすいようにデータ配列を適切にする)
  3. データ格納(データを格納しておく)
  4. データ解析(実際のデータを用いてデータ分析・解析する)
  5. データ可視化(解析結果の意味がわかりやすいように可視化する)

本記事では、Pandasを用いた1. データ収集と2.データ前処理の範囲をカバーしています。

今回は”pandas”ライブラリとformat文を用いて、読み込んだ複数のCSVファイルの複数データを抽出し、データ毎に新しいファイル名で保存する方法を紹介します。

Baran

それでは、やっていきましょう。

2. 実務で使えるファイル名を自動変更して保存する方法

まず、本記事で使用するCSVが格納されているフォルダ構成例の全体図を見ていきましょう。

カレントディレクトリに”csv_file”フォルダを用意し、その直下に2つのCSVファイル(example_001.csv, example_002.csv)があります。さらに、”folder”があり、その直下に1つCSVファイル(example_003.csv)があります。

example_001.csv
1,11,21,31,41
2,12,22,32,42
3,13,23,33,43
4,14,24,34,44
5,15,25,35,45

example_002.csv
6,16,26,36,46
7,17,27,37,47
8,18,28,38,48
9,19,29,39,49
10,20,30,40,50

example_003.csv
101,111,121,131,141
102,112,122,132,142
103,113,123,133,143
104,114,124,134,144
105,115,125,135,145

それでは複数CSVファイルのデータを抽出して、新しいcsvファイルを出力してみましょう。

サンプルコードは以下です。今回は出力するファイル名をカラムごとにスライスして、新しいCSVファイルにカラム名と年月を追加して保存します。

import pandas as pd
from pathlib2 import Path 

COLUMN_NAMES = ['A', 'B', 'C', 'D', 'E']

""" Month """
MONTH = "2020-08"

LIST = []

def main():
    for name in COLUMN_NAMES:
        P = Path('./csv_file')
        FILE_NAME = '**/*.csv'
        CSV_FILES = P.glob(FILE_NAME)
        for file in CSV_FILES:
            df1 = pd.read_csv(file, names=COLUMN_NAMES)
            df2 = df1.loc[:, name]
            LIST.append(df2)
        
        df = pd.concat(LIST, axis=1)

        """ 出力ファイルパスおよびファイル名 """
        OUTPUT = 'example_005_{0}_{1}.csv'.format(MONTH, name)
        """ 新しいCSVとして出力する """
        df.to_csv(OUTPUT, index=True, encoding="utf-8")
        """ LIST中身を消去する """
        LIST.clear()


if __name__ == '__main__':
    main()

“pathlib”ライブラリやデータスライス方法、データ結合方法が不明な方は以下のブログを見ていただけると理解がスムーズかと思います。

データ抽出

まず、スライスするカラムデータと年月の変数を指定します。今回は5列のデータがあるので、カラム名を5つ用意しています。

COLUMN_NAMES = ['A', 'B', 'C', 'D', 'E']
MONTH = "2020-08"

次にメイン関数の中身を見まていきましょう。まず、”COLUMN_NAMES”の値でfor文を作成します。つまり、最初はname=”A”として、for文以下の処理を行います。

    for name in COLUMN_NAMES:
        P = Path('./csv_file')
        FILE_NAME = '**/*.csv'
        CSV_FILES = P.glob(FILE_NAME)

次のfor文でCSVファイルのデータを一つ一つ読み込んでいきます。スライスするデータは、”loc[:, name]”です。最初は、列名name=”A”の行をすべて取得しています。

あとは、取得したデータをLISTに格納しています。

        """ 一括でフォルダ内のcsv読込=>データ抽出 """    
     for file in CSV_FILES:
            df1 = pd.read_csv(file, names=COLUMN_NAMES)
            df2 = df1.loc[:, name]
            LIST.append(df2)

すべてのCSVファイルのデータ取得が完了したら、LISTに格納されているデータを結合し、新たなデータフレームdfに代入します。(axis=1なので、横方向に結合します。)

        df = pd.concat(LIST, axis=1)

出力ファイル名を決定するため、format関数を使用します。format関数は、()内の変数を文字列””に代入することができます。ここでは、{0:MONTH=”2020-08″, 1:name=”A”}が代入されます。

つまり、出力ファイル名は”eample_005=2020-08_A.csv”となります。

        OUTPUT = 'example_005_{0}_{1}.csv'.format(MONTH, name)
        df.to_csv(OUTPUT, index=True, encoding="utf-8")

そして、最後に情報を格納したLISTの中身を消去します。これを実施しないと、次のループ時にAの情報が残るため、次のcsvファイルにAの情報も記載されることになります。

        """ LIST中身を消去する """
        LIST.clear()

以上の動作を”B”~”E”まで行います。出力されたファイル”eample_005=2020-08_A.csv”を見てみましょう。A列のデータのみが保存されていることがわかりますね。

	A	 A	A
0	1	 6	101
1	2	 7	102
2	3	 8	103
3	4	 9	104
4	5	10  105

保存データも見ておきます。ちゃんとデータごとに名前が変更されており、保存されていることが確認できました。

3. まとめ

今回の記事は、pythonによる複数csvファイルのデータを抽出し、一つのデータとして結合、新しいcsvファイルをデータごとに名前を変更して出力する方法をまとめました。

データ構造が同じCSVファイルであれば、複数のデータを一括で抽出し、それぞれのデータ項目にまとめて、ファイル名を変更して出力することができます

この操作により、大量の同じデータ構造を処理して、名前も自由に変更できるので、使いこなせると業務が捗りますね。

次回は、csvファイルを読み込んでリスト形式にする方法を記事にする予定です。

Baran

それでは、良いpythonライフを!

Baran

以下の記事も書いています。よかったらご覧ください。

Twitterもやってまーす。

3件のコメント

分かりやすい解説ありがとうございます。

質問です。勘違いしていたらすみません。

コピペして試してみた。
無事5つのcsvファイル(example005_2020_08_A.csv~example005_2020_08_E.csv)として保存できたのですが、
全ての中身がexample005_2020_08_A.csvと同じでした。
    A A A
0 1 6 101
1 2 7 102
2 3 8 103
3 4 9 104
4 5 10   105

これで出力は合ってますか?
(カラム名と列の値がB~Dへと変わるものかと思っていました汗)

(各所にprintを入れて確認してみたところ、二番目のfor
      for file in CSV_FILES:
  df1 = pd.read_csv(file, names=COLUMN_NAMES)
  df2 = df1.loc[:, name]
   LIST.append(df2)
が一度しか回っていない(?)ようでした。)

old_rivさん

ご連絡ありがとうございます。返信が遅れてしまい申し訳ありません。
確認したところ、仰るとおり、すべてのcsvファイルが同じになっているようです。
原因として、一度Pathで開いたディレクトリは再度呼び出さないと、ループできないようです。
なので、for文の中にPathルートを記載すれば、再度読み込みが行われるので、お試しください。
また、現状のコードだと、LIST中身が残っているため、for文で回し続けると前のループで格納した情報が残っています。(A情報がBにも入ってします。)
そのため、ループの最後に、LISTの中身を削除するclear()関数で対応します。

以下のコードをお試しいただければ幸いです。(インデントが消えてしまっているので、ブログの方も修正しておきますのでそちらをご覧いただけると幸いです)

from pathlib2 import Path

COLUMN_NAMES = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]

“”” Month “””
MONTH = “2020-08”
LIST = []

def main():
for name in COLUMN_NAMES:
P = Path(‘./csv_file’)
FILE_NAME = ‘**/*.csv’
CSV_FILES = P.glob(FILE_NAME)
for file in CSV_FILES:
df1 = pd.read_csv(file, names=COLUMN_NAMES)
df2 = df1.loc[:, name]
LIST.append(df2)

df = pd.concat(LIST, axis=1)

“”” 出力ファイルパスおよびファイル名 “””
OUTPUT = ‘example_005_{0}_{1}.csv’.format(MONTH, name)
“”” 新しいCSVとして出力する “””
df.to_csv(OUTPUT, index=True, encoding=”utf-8″)
LIST.clear()

if __name__ == ‘__main__’:
main()

ご連絡ありがとうございました。

【Python入門】CSVファイルをリスト形式で読み込む方法【初心者向き】 | バランブログ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US

Baran-gizagiza
経歴:浪人→理系大学院卒業→大手製造業に就職(技術職)→アメリカ赴任中 仕事は、研究・設計など上流工程の仕事に携わっています。企業勤務を継続しながら、新しいことにチャレンジしたいと思い、ブログを下記はじめました。 このブログでは、趣味である 筋トレ(健康、ダイエット) AIとデータ(高校数学、プログラミング) 読書(主に自己啓発系) を中心に、人生経験やおすすめ情報の発信しています。