Python {Article007}

ようこそ「Python」へ...

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ファイルを準備する

  1. Excelでデータを作成する

    click image to zoom!
    図1
    Excelを起動したら図1のような人口データを作成します。 1行目にはカラムヘッダーとして「Country」「SurveyYear」「Population」を入力します。 2行目からは国名、年度、人口を入力します。 すべてのデータを入力したら「Japan.xlsx」の名称で保存します。 以下、同様の手順で中国、アメリカ、インド等のデータを入力して保存します
    click image to zoom!
    図2
    ここでは10ヶ国の人口データを作成しています。

複数のExcelファイルをマージして保存する

  1. フォルダ内の全ての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)
    click image to zoom!
    図3
    図3は「print(files)」の実行結果です。 Globではファイルのパス名が「./data/excel/article007\\Australia.xlsx」の形式で返されます。
  2. フォルダ内の全ての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)
    click image to zoom!
    図4
    図4は実行結果です。データ件数が130件になっているのですべてのデータがマージされたことになります。

シンプルな線グラフを描画して見る

  1. 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()
    click image to zoom!
    図5
    図5は実行結果です。グラフに中国、インドネシア、日本、インドの線(ライン)が描画されています。