複数のファイルを1つにまとめる
複数のデータをExcel上で、コピペしてまとめるのは面倒です。
自動化しましょう。
サンプルのCSVファイルは下のボタンからダウンロードできます
今回は複数のCSVファイルのデータを連結して、1つのExcelファイルを作成するプログラムです。
名簿やレポート等、何かのシステムから書き出されたCSVファイルが大量に届く事はよくあります。
そんな時に、このプログラムを使えばデータを1つのExcelファイルにまとめてくれます。すぐに集計や分析を始めることができます。
data1.csv~data3.csvの3つのCSVファイルを用意して、put_together.pyを実行すると連結後のExcelファイルdata.xlsxが作成されます。
コードと解説
put_together.py
import pandas as pd
# 読み込むcsvファイルのリスト
file_list = ["data1.csv", "data2.csv", "data3.csv"]
# CSVデータを蓄積するリスト
data_list = []
# csvファイルを読み込むループ
for csv_filename in file_list:
# csvファイルの読み込み
df = pd.read_csv(csv_filename)
# 行ループ
for index, rows in df.iterrows():
# 1行分のデータを保存する作業用リスト
work = []
# 列ループ
for col in rows:
# 列を追加
work.append(col)
# 1行分のデータをリストに追加
data_list.append(work)
# 最後に読み込んだCSVファイルから列名を取得
columns = list(df.columns)
print(data_list)
# data_listを元にデータフレームを作成
df = pd.DataFrame(data_list, columns=columns)
with pd.ExcelWriter("data.xlsx") as writer:
df.to_excel(writer, index=False)
3行目に連結するCSVファイルの名前が書かれています。
ここを変更すれば好きなファイルを連結するように改造できます。
このプログラムは三重ループ、つまり3つの繰り返し処理が入れ子になっています。
1つ目のループはファイルの読み込みです。
変数file_listに入れたファイルを1つずつ読み込みます。
2つ目のループを読み込んだ表データを1行ずつ処理していく行ループです。
iterrowsメソッドとは
iterrowsメソッドは表データを1行ずつ繰り返し、処理に渡すもので、
for index, rows in df.iterrows( ):
と書くと変数indexに行番号、変数rowsに1行分のデータが入ります。
3つ目のループは1行分のデータから1行ずつデータを取り出すものです。
三重ループが終わると、変数データーリストに3つのCSVファイルから取り出したデータを求めた二重リストが入っています。
最後に変数data_listとCSVファイルから取得した説明を組み合わせて、新しいデータフレームオブジェクトを作成し、それをto_excelメソッドで保存します。
ファイルで繰り返して、行で繰り返して、列で繰り返す。これで三重の繰り返しになってるってだけの話です。
ループとリスト
表データを扱うとループとリストがよく出てきます。
リストはPythonで複数のデータをまとめるために使うデータ型です。
今回のプログラムでは読み込むCSVファイルの名前をリストにしています。
今回のプログラムでは連結中のデータを一時的に記憶するために使っています。
データフレームオブジェクトは平データしか記憶できませんがリストは非常に柔軟なのでいろいろな形式のデータを記憶できます。
ループは繰り返し処理のことでPythonではfor文を使って書きます。
Inの後に書いたリストから1つずつデータを取り出し、それをinの前の変数に入れて次の処理を行います。
プログラムの行ループの部分では、iterrows メソッドを使って、データフレームオブジェクトから1行ずつデータを取り出しています。
iterrowsメソッドは、行のインデックスと行データ本体(正確にはseriesオブジェクトのセット)を返すため、indexとrowsという2つの変数で受け取っています。
データフレームオブジェクトでは、行ごとに繰り返し処理をすることが多いです。そして、iterrowsメソッドを使えば、1列ずつ取り出す列ごとの繰り返し処理も行えます。
for label , content in df.iteritems():
列ごとの処理
二重リストから、データフレームオブジェクトを作る
put_together.pyの最後で連結したファイルを保存するために、二重リストからデータフレームオブジェクトを作成しています。
二重リストには列名が入っていないため、既存のデータフレームオブジェクトからカラム属性を使って列名のリストを取り出し、二重リストと組み合わせて、列名のデータフレームオブジェクトを作成しています。
pd.DataFrame(リスト, columns=列名のリスト)
と書けば、リストからデータフレームオブジェクトが作れます。
逆にデータフレームオブジェクトから二重リストを作るときは、
DataFrame.tolistメソッドを使います。目的に応じてデータ形式を変換するとできることの幅が広がります。
PythonでExcelを操る他テクニック
openpyxlの使い方 Excelの差し込みがワンクリックで
tabulaのconvert_into関数でPDFファイルをExcelに変換
これは便利!Pythonのconcat関数で追記するプログラムをつくる
【Python】項目がバラバラなExcelファイルを一つにまとめる