HOWTO · Python

複数の CSV ファイルを Pandas にインポートし、1つの DataFrame に連結する

このチュートリアルでは、Pandas を使用して複数の CSV ファイルをインポートし、それらを単一の DataFrame に連結する方法を示します。

このチュートリアルでは、複数の .csv ファイルを読み取り、すべての DataFrame を 1つに連結する方法について説明します。

このチュートリアルでは、Pandas を使用してデータ ファイルを読み取り、DataFrame を作成して結合します。

パンダとは

このパッケージには、さまざまなデータ ファイルを読み取り、データ操作技術を実行するためのさまざまな関数が付属しています。

pandas パッケージをマシンにインストールするには、コマンド プロンプト/ターミナルを開いて pip install pandas を実行する必要があります。

Pandas を使用して単一の .csv ファイルを読み取る方法

pandas パッケージは、.csv ファイルを読み取る機能を提供します。

>>> import pandas as pd
>>> df = pd.read_csv(filepath_or_buffer)

ファイル パスを指定すると、pandas 関数 read_csv() はデータ ファイルを読み取り、オブジェクトを返します。

>>> type(df)
<class 'pandas.core.frame.DataFrame'>

Python で複数の CSV ファイルを読み取る

pandas モジュールのみを使用してこのタスクを実行するための明示的な関数はありません。 ただし、次のことを実行するための合理的な方法を考案できます。

まず、すべてのデータ ファイルのパスが必要です。 すべてのファイルが 1つの特定のフォルダーにある場合は簡単です。

すべてのファイルのパスと名前が保存されるリストを作成します。

>>> import pandas as pd
>>> import glob
>>> import os
>>> # This is a raw string containing the path of files
>>> path = r'D:\csv files'
>>> all_files = glob.glob(os.path.join(path, '*.csv'))
>>> all_files
['D:\\csv files\\FILE_1.csv', 'D:\\csv files\\FILE_2.csv']

上記のコードでは、ファイル パスを含むリストが作成されます。

glob モジュール

glob モジュールを使用して、パターンに一致するファイルまたはパス名を見つけます。 glob は、標準の Unix パス展開規則に従ってパターンに一致します。

このモジュールは既に Python に含まれているため、外部にインストールする必要はありません。 ただし、このパッケージがない場合は、pip install glob2 と入力してください。

ディレクトリ/ファイルおよびサブディレクトリ/サブファイル内からパスを再帰的に取得するには、glob モジュールの関数 glob.glob() および glob.iglob() を利用できます。

構文:

glob.glob(pathname, *, recursive=False)
glob.iglob(pathname, *, recursive=False)

この関数は、すべてのファイルのパスを含むリストを返します。

たとえば、特定のパスからすべてのファイル名を取得するには、パスの末尾にアスタリスク記号 * を使用し、それを文字列として glob.glob('') 関数に渡します。

>>> for files in glob.glob(r'D:\csv files\*'):
	    print(files)

D:\csv files\FILE_1.csv
D:\csv files\FILE_2.csv
D:\csv files\textFile1.txt
D:\csv files\textFile2.txt

さらに、アスタリスク記号の後にファイル拡張子を指定して、より絞り込んだ検索を実行します。

>>> for files in glob.glob(r'D:\csv files\*.csv'):
	    print(files)

D:\csv files\FILE_1.csv
D:\csv files\FILE_2.csv

生の文字列とは

Python では、生の文字列は r または R をリテラル文字列に追加することによって形成されます。 バックスラッシュ (\) は、Python 生文字列のリテラル文字です。

これは、バックスラッシュを含む文字列が必要であるが、エスケープ文字と見なされたくない場合に便利です。

例えば:

タブや改行などの特殊文字を表すには、バックスラッシュ (\) を使用してエスケープ シーケンスの開始を示します。

>>> print("This\tis\nnormal\tstring")
This	is
normal	string

ただし、生の文字列はバックスラッシュ (\) をリテラル文字として扱います。 例えば:

>>> print(r"This\tis\nnormal\tstring")
This\tis\nnormal\tstring

osモジュール

Python の os モジュールには、オペレーティング システムを処理するためのメソッドが含まれています。 os は、Python の基本的なユーティリティ モジュールに含まれています。

このモジュールは、オペレーティング システムに依存する機能を使用する移植可能な方法を提供します。 os モジュールのサブモジュールである Python の os.path モジュールは、一般的なパス名を操作するために使用されます。

Python の os.path.join() 関数は、1つ以上のパス コンポーネントをインテリジェントに結合します。 最後のパス コンポーネントを除いて、このアプローチは、空でない各部分の後に正確に 1つのディレクトリ セパレータ ("/") を配置することによって、異なるパス コンポーネントを連結します。

リンクされる最後のパス コンポーネントの最後に、ディレクトリ セパレータ ("/") が追加されます。

パス コンポーネントが絶対パスを表し、結合が絶対パスを表すコンポーネントに移動する場合、以前に接続されていたすべてのコンポーネントが削除されます。

構文:

os.path.join(path, *path)

異なるパス コンポーネントをマージするには、os.path.join() 関数を使用します。

import os

path = "Users"
os.path.join(path, "Desktop", "data.csv")

出力:

'Users\\Desktop\\data.csv'

Python で複数の DataFrame を連結する

さらに進んで、glob.glob() 関数から返されたパスを使用してデータをプルし、データフレームを作成します。 続いて、Pandas データフレーム オブジェクトもリストに追加します。

コード:

dataframes = list()

for dfs in all_files:
    data = pd.read_csv(dfs)
    dataframes.append(data)

データフレームのリストが作成されます。

>>> dataframes
[dataframe1, dataframe2]

データフレームの連結。

注: データフレームを連結する前に、すべてのデータフレームに同様の列が必要です。

pd.concat(dataframes, ignore_index=True)

pandas.concat() メソッドは、Pandas オブジェクト軸と一緒にすべての集中的な連結操作を処理し、オプションのエクストラとして、他の軸のインデックスの論理操作 (結合または交差) を設定します。

完全なコード:

# importing the required modules
import pandas as pd
import os
import glob

# Path of the files
path = r"D:\csv files"

# joining the path and creating list of paths
all_files = glob.glob(os.path.join(path, "*.csv"))

dataframes = list()

# reading the data and appending the dataframe
for dfs in all_files:
    data = pd.read_csv(dfs)
    dataframes.append(data)

# Concatenating the dataframes
df = pd.concat(dataframes, ignore_index=True)