Pythonで複数のExcelファイルをマージして一元化するには【Python】
ここでは複数のExcelファイルをマージ(併合)してExcelファイルに一元化する方法について解説します。
たとえば、売上データなどを月単位でExcelファイルに作成するといったことがあると思います。
この場合1年分の売上を集計したり分析しようとしたときには12個のExcelファイルをマージして一元化する必要があります。
Excelのファイルを取り込んで一元化するにはPandasを使用します。
ここでは、一元化したExcelファイルを保存する方法についても説明します。
一元化したデータをAccessのデータベースに保存する方法については
「記事(Article005)」を参照してください。
さらに、一元化したデータを分析するためにMatplotlibで簡単なグラフを作成する方法についても解説します。
ここでは、Pyodbc、Pandas、Maptplotlib、Numpy(オプション)等のライブラリを使用しますので
「記事(Article001) | 記事(Article002) | 記事(Article003) | 記事(Article004)」
を参照して事前にインストールしておいてください。
Pythonのコードを入力するときにMicrosoftのVisula Studio Codeを使用します。
まだ、インストールしていないときは「記事(Article001)」を参照してインストールしておいてください。
説明文の左側に図の画像が表示されていますが縮小されています。
画像を拡大するにはマウスを画像上に移動してクリックします。
画像が拡大表示されます。拡大された画像を閉じるには右上の[X]をクリックします。
画像の任意の場所をクリックして閉じることもできます。
複数のExcelファイルを準備する
-
Excelでデータを作成する
Excelを起動したら図1のような人口データを作成します。
1行目にはカラムヘッダーとして「Country」「SurveyYear」「Population」を入力します。
2行目からは国名、年度、人口を入力します。
すべてのデータを入力したら「Japan.xlsx」の名称で保存します。
以下、同様の手順で中国、アメリカ、インド等のデータを入力して保存します
ここでは10ヶ国の人口データを作成しています。
複数のExcelファイルをマージして保存する
-
フォルダ内の全てのExcelファイルのパスを取得する
Visual Studio Code(VSC)を起動したら以下のコードを入力して実行します。
行2-3ではPandasとGlobのライブラリを取り込んでいます。
行6ではフォルダ「./data/excel/article007」に格納されているすべてのExcelファイル(*.xlsx)のパス名を取得してリスト型の変数filesに格納しています。
行7ではfilesリストを表示しています。
# Import necessary libraries
import pandas as pd
import glob
# Merge multiple excel files into a single excel file
files = [file for file in glob.glob('./data/excel/article007/*.xlsx')]
print(files)
図3は「print(files)」の実行結果です。
Globではファイルのパス名が「./data/excel/article007\\Australia.xlsx」の形式で返されます。
-
フォルダ内の全てのExcelファイルを一元化して保存する
行8ではPandasの空のDataFrameを生成しています。
行10-12のforループでは「./data/excel/article007」フォルダに格納されているすべてのExcelファイルを取り込んでPandasのDataFrameに一元化しています。
行11ではPandasのread_excel()メソッドでExcelファイルのデータをPandasのDataFrameに取り込んでいます。
行12ではPandasのappend()メソッドでExcelから取り込んだデータ(df)を「all_df」のDataFrameに追加しています。
Pandasが独自に作成した「index」フィールドは追加したくないので「ignore_index=True」を指定しています。
行14では一元化したDataFrame(all_df)のレコード件数と列数を表示しています。
行15-16では一元化したDataFrame(all_df)の先頭と終端のレコードを1件ずつ表示しています。
行19では一元化したDataFrame(all_df)をExcelファイル(all_data.xlsx)として「./data/excel/article007/merge」フォルダに保存しています。
Pandasが独自に作成した「index」フィールドは保存したくないので「 index=False」を指定しています。
# Import necessary libraries
import pandas as pd
import glob
# Merge multiple excel files into a single excel file
files = [file for file in glob.glob('./data/excel/article007/*.xlsx')]
all_df = pd.DataFrame()
for file in files:
df = pd.read_excel(file)
all_df = all_df.append(df, ignore_index=True)
print(all_df.shape)
print(all_df.head(1))
print(all_df.tail(1))
# Save the data frame
all_df.to_excel('./data/excel/article007/merge/all_data.xlsx', index=False)
図4は実行結果です。データ件数が130件になっているのですべてのデータがマージされたことになります。
シンプルな線グラフを描画して見る
-
Matplotlibで線グラフを描く
行2-3ではMatplotlib, Numpyのライブラリを取り込んだいます。
行7では日本語のフォントを指定しています。
行8ではグラフのスタイルを指定しています。
行10では線グラフを描く国名を定義しています。ここでは中国、インドネシア、日本、インドの線グラフを描画します。
行11では線グラフの色を定義しています。
行12-14のforループではPandasのDataFrame(all_df)に格納されているデータから中国、インドネシア、日本、インドのデータを絞り込んで線グラフを描画しています。
行13ではPandasのDataFrameを特定の国に絞り込んでいます。
行14ではMatplotlibのplot()メソッドを使用して絞り込んだ国の線グラフを描画しています。
行16-17では線グラフのX軸、Y軸のラベルを設定しています。
行18では線グラフのタイトルを設定しています。
行19では凡例を表示させます。
行20では線グラフを画面に表示します。
# Load the necessary libraries
import matplotlib.pyplot as plt
import matplotlib.style as style
import numpy as np
# Draw a line graph of the population
plt.rcParams['font.family'] = 'Yu Gothic'
style.use('ggplot')
countries = ['China','Indonesia','Japan','India']
colors = ['g','c','r','b']
for country in countries:
df = all_df.loc[all_df['Country'] == country]
plt.plot(df.SurveyYear, df.Population, colors.pop(0),label=country, linewidth=5)
plt.xlabel('Year')
plt.ylabel('Population')
plt.title('Population Line Graph')
plt.legend()
plt.show()
図5は実行結果です。グラフに中国、インドネシア、日本、インドの線(ライン)が描画されています。