updated on 2019-09-22
私の大学の8つの学科の成績データを使用してます。8つのExelファイルを合体させて1つのExelファイルにまとめることが目的です。
なおpandasの関数を使い、csvファイルでもxlsxファイルでも問題なく合体できます。
Python 3.7.3
pandas 0.25.1
jupyter notebook
合体させたい8つのExelファイルは、カラムが同一のものもあれば、違うものもあります。例えば、「期末試験」のカラムはどの学科の成績ファイルのも存在するものの、「ブロックプログラミング」のカラムは一部の学科にしか存在しません。
データを合体させる際、8つのExelファイルで全ての学科に存在する共通のカラムのみを取り出し、合体ファイルを作成します
Exelファイルを取り込むのではなくcsvファイルを取り込むかたは
pd.read_excel ではなく pd.read_csvを使ってください。
データフレームをExelファイルに出力するではなくcsvファイルを出力する方は
DataFrame.to_excel ではなく DataFrame.to_csv を使ってください
import pandas as pd import glob path ='/path/to/your_folder' allFiles = glob.glob(path + "/*.xlsx") # 指定したフォルダーの全エクセルファイルを変数に代入します frame = pd.DataFrame() list_ = [] for file_ in allFiles: df = pd.read_excel(file_,index_col=None, header=0) # エクセルをデータフレームとして読み込む list_.append(df) frame = pd.concat(list_, join='inner') # joinをinnerに指定 frame.to_excel("/path/to/download/all_concat.xlsx", encoding="utf-8-sig")
pandasのDataFrame.concat はデフォルトでは、join='outer'が指定されており、共通しないカラムも同時に表示させてしまう。
join='outer'とjoin='inner'の違いを例で示す。
(例) >>> import pandas as pd >>> df_1 = pd.DataFrame({'A': ['A1', 'A2', 'A3', 'A4'], ... 'B': ['B1', 'B2', 'B3', 'B4'], ... 'C': ['C1', 'C2', 'C3', 'C4'], ... 'D': ['D1', 'D2', 'D3', 'D4']}, ... index=[1, 2, 3, 4]) >>> >>> df_2 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'], ... 'D': ['D2', 'D3', 'D6', 'D7'], ... 'F': ['F2', 'F3', 'F6', 'F7']}, ... index=[5, 6, 7, 8]) >>> pd.concat([df_1, df_2]) A B C D F 1 A1 B1 C1 D1 NaN 2 A2 B2 C2 D2 NaN 3 A3 B3 C3 D3 NaN 4 A4 B4 C4 D4 NaN 5 NaN B2 NaN D2 F2 6 NaN B3 NaN D3 F3 7 NaN B6 NaN D6 F6 8 NaN B7 NaN D7 F7 >>> pd.concat([df_1, df_2], join="inner") B D 1 B1 D1 2 B2 D2 3 B3 D3 4 B4 D4 5 B2 D2 6 B3 D3 7 B6 D6 8 B7 D7
innerの時は共通カラムのBとDだけ表示されている。
この挙動はSQLのinner joinやouter joinと同じである。
複数のcsv(またはxlsx)ファイルを結合させる時は、pd.concatで結合する。
共通カラムのみ表示した時はinner join, 全てのカラムを表示させたいならouter joinを指定する。