本ブログでは、生成AIを使ったプログラミングを使って現場のDXを進める方法を中心に解説を進めてきました。プログラミングの実務を生成AIに任せることは事実ですが、コードが何を意味しているのか、読解する知識がある方が効率的に作業を進めることが出来ます。
本記事では、Pythonを使ったシンプルなデータ整形のコードを題材にして、使われているライブラリやメソッドについて解説をします。
ライブラリやメソッドとは?
Pythonはライブラリとそこに含まれるメソッドを利用することで、比較的単純なコードで複雑な処理を実行できるプログラミング言語です。
ライブラリについて
ライブラリはPythonを特徴づける要素の一つで、簡単に言うと「様々なツールが入った工具箱」のようなものです。処理に応じて適切な工具箱(= ライブラリ)を用意することでコードを単純化することが出来ます。
メソッドについて
ライブラリが工具箱なら、メソッドは工具に当たります。工具箱に入ったツール(= メソッド)を取り出すことで目的に沿った処理が出来ます。メソッドはライブラリに紐づいているため、処理に必要なメソッドを使うには、ライブラリを用意する必要があります。
今回の題材: ライブラリの呼び出しとメソッドを使ったデータの抽出
ライブラリとメソッドについて、おおよそのイメージが付いたところで、今回はPandasライブラリをつかってシンプルなデータ整形をしてみたいと思います。今回は、同じフォルダの中に格納した複数のcsvファイルの、5行目以降の2列分のデータを取得し、縦に結合するスクリプトを実行します。
下にスクリプトを示します。今回はスクリプトを詳しく解説します。
# 使用するライブラリを指定する
import pandas as pd
import os
import glob
# データの入っているフォルダを指定する
read_folder = r"input_where_your_foleder"
# データを格納するための空のリストをあらかじめ作っておく
all_data = []
# フォルダ内のcsvファイルを"read_csv"という形で指定する。*(ワイルドカード)を使うとフォルダ内の全てのcsvファイルを指定可能
read_csv = os.path.join(read_folder, "*.csv")
# csvファイルのパスを取得する
files = glob.glob(read_csv)
# 読み込んだcsvファイルからデータを取得する。繰り返し処理のためfor文を用いる
for file in files:
# csvファイルをdfという名前のデータフレームとして読み込む
df = pd.read_csv(file, header=None)
# 5行目以降の1列目と2列目を取得(0-indexのため4行目から)
data = df.iloc[4:, [0, 1]]
# データを事前に作った空のリストに追加
all_data.append(data)
# all_dataに格納したデータを縦に結合
merged_df = pd.concat(all_data, ignore_index=True)
ライブラリの呼び出し
# 使用するライブラリを指定する
import pandas as pd
import os
import glob
今回使用するライブラリは、3つです。
- pandas
- os
- glob
ライブラリを呼び出す際は、必ず”import ~”と書きます。”import A as B”のような形で読み込むことも多く、「Aを呼び出して、Aを略してBと呼びます」のような意味になります。pandasなどはよく使うため、pdという形で略すことが一般的です。
pandasはデータフレーム(表形式のデータ)を扱うために使います。データ分析をする際は必ずと言っても良いほど使用されます。
osはフォルダやファイルの場所(ディレクトリ)を指定したりする際に便利なライブラリです。今回は複数のcsvファイルを扱うため使用します。
globはパスやファイル名をリストとして一塊で処理するために使います。リストで取得したファイル名をfor文使って一つずつ処理するため、globを使っています。
作業をするフォルダーの指定
# データの入っているフォルダを指定する
read_folder = r"input_where_your_foleder"
まずは作業をするフォルダーを指定します。”read_folder”という名前(変数名)で、フォルダーを指定します。このとき、名前は何でも良いですが、一般的には変数名は小文字で指定することが多いです。「r””」のダブルクォーテーションの部分にフォルダのパスを入力します。ダブルクォーテーションの前にrを付けているのは、入力したパスがそのままの文字列で使用されるようにする(rawで使う)ためです。付けないの勝手に読み替えられて、エラーが出ることが多いため付けています。
空のリストの作成
# データを格納するための空のリストをあらかじめ作っておく
all_data = []
複数のファイルから取得したデータを合体させる前に、データを一時的に保管するための空のリストを作っておきます。リストとは、いろいろな形式のデータを要素としてひとまとめにしておける箱のようなものと考えてください。
読み込むファイルの場所と種類の指定(os.path.join)
# フォルダ内のcsvファイルを"read_csv"という形で指定する。*(ワイルドカード)を使うとフォルダ内の全てのcsvファイルを指定可能
read_csv = os.path.join(read_folder, "*.csv")
今回使用するファイルを読み込む前に、どんな種類のファイルを読み込むか?を指定します。ファイルの種類と場所を指定するために、osライブラリを使用しています。先程”read_folder”という名前を付けたディレクトリ(場所)と”*.csv”をくっつける(os.path.join(A, B))ことで、”read_csv”という名前でファイルの種類を指定しています。”*”はワイルドカードと呼び、”*.csv”とすることで、「”.csv”で終わる全てのファイル」の意味になります。
globでよみこむファイル名を取得する
# csvファイルのパスを取得する
files = glob.glob(read_csv)
“read_csv”でファイルの場所と種類を指定したので、今度はデータを取得するファイルの名前をglobを使って取得します。取得したファイル名は、”files”という名前で、リストの形式を取ります。
for文を使ったデータ取得の繰り返し
# 読み込んだcsvファイルからデータを取得する。繰り返し処理のためfor文を用いる
for file in files:
# csvファイルをdfという名前のデータフレームとして読み込む
df = pd.read_csv(file, header=None)
# 5行目以降の1列目と2列目を取得(0-indexのため4行目から)
data = df.iloc[4:, [0, 1]]
# データを事前に作った空のリストに追加
all_data.append(data)
次はいよいよ実際にデータを読み取ります。複数のファイルにまたがってデータ取得し、繰り返し同じ処理を実行するため、for文を使います。for文は、”for A in B:”で繰り返し処理を宣言し、以降インデント(字下げ)した部分に処理を書きます。処理を書き終えたら、字上げを行います。
for文
# 読み込んだcsvファイルからデータを取得する。繰り返し処理のためfor文を用いる
for file in files:
“for A in B”と書かれるように、「Bの中のAという要素」に対して処理を実行します。今回は、”files”という名前でリストとなっているcsvファイルに対して、一つずつ処理を実行します。
データフレーム形式でのデータの読み込み
# csvファイルをdfという名前のデータフレームとして読み込む
df = pd.read_csv(file, header=None)
“file”という名前で指定された、csvファイルをpandasデータフレームとして読み込みます。読み込んだデータは”df”という名前が付けられています。”header = None”と指定することで、読み込んだデータの1行目をヘッダー(列名)として認識しないようになります。
データフレームからのデータの抜き取り
# 5行目以降の1列目と2列目を取得(0-indexのため4行目から)
data = df.iloc[4:, [0, 1]]
ilocメソッドを使ってdfから必要なデータを抜き取ります。ilocはpandasに含まれるメソッドで、pandasデータフレームの任意の位置からデータを取り出す際に使います。”[4:, [0, 1]]”とすることで、「5行目以降で、(4:, )1列目から2列目([0, 1]のデータ」を指定できます。pandasでは、1列目や1行目を0で指定する点に注意してください。
抜き取ったデータを空のリストに格納
# データを事前に作った空のリストに追加
all_data.append(data)
dfから抜き取ったデータを空のリスト(all_data)に格納します。for文で繰り返し処理される中で、各csvファイルから取得されたデータが次々に格納されていきます。”files”の中に含まれるcsvファイル全てにデータの読み込み~all_dataへのデータの格納までが実施されると処理が終了します。
抜き取ったデータの結合
# all_dataに格納したデータを縦に結合
merged_df = pd.concat(all_data, ignore_index=True)
最後に、”all_data”に格納したデータを縦に結合します。結合はpandasのconcatメソッドを使います。”all_data”に含まれるデータが読み込みを実施した順で縦に結合されます。”ignore_index = True”とすることで、インデックス(行番号)がない状態で最終的なデータ(merged_df)が作成されるため、データを軽くする効果があります。
まとめ
以上、今回は複数のファイルから抜き取ったデータを縦に結合する、というデータ分析を実施する手前でよくやる処理を題材にコードを解説しました。今後も実際のコードを使った解説を行って行こうと思うので、リクエストが有ればコメントからお願いします!
コメント