Dragon Arrow written by Tatsuya Nakaji, all rights reserved animated-dragon-image-0164

pandas 複数のcsvファイルの読み込み

イメージ
Sep 22, 2019

pandas 複数のcsvファイルの読み込み


実現したいこと


私の大学の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を指定する。