
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 D7innerの時は共通カラムのBとDだけ表示されている。
この挙動はSQLのinner joinやouter joinと同じである。
複数のcsv(またはxlsx)ファイルを結合させる時は、pd.concatで結合する。
共通カラムのみ表示した時はinner join, 全てのカラムを表示させたいならouter joinを指定する。