今回の記事では、データ処理のためのツールであるPandasについて扱ってみようと思う。
データ可視化のための環境構築がまだであれば、下記の記事を参照してほしい。
1. Pandasとは?
Pandas(パンダス)は、データの操作および分析のためのライブラリである。
リストやディクショナリを表形式にして処理することができる。

例えば、次のように内部に3つのリストが入っているリストがあるとしよう。
lstInLst = [[1,2,3],[4,5,6],[7,8,9]]このデータの表現方法だけを変えると、下のような形になる。一見すると、どことなく表のように見える。
lstInLst = [[1,2,3],
[4,5,6],
[7,8,9]]これをPandasに変換してみると…
import pandas as pd
df = pd.DataFrame(lstInLst)
print(df)下のように表の形式になる。
このようなPandasのデータ型をデータフレームと呼ぶ。

このデータは、行ごと、列ごとに処理することができる。
イメージしづらければ、Excelと似ていると考えてもよい。
それでは、おおまかな機能を見ていこう。
2. 基本的なPandasの使い方
上でPandasはExcelと似ていると言った。
したがって、Pandasを使うときに身につけるべき機能は、Excelを使うときに身につける機能と同じだ。
一般的にExcelを使うとき、最も重要な機能はデータの確認、ソート、欲しいセルのコピーなどである。
これらの内容を中心に、Pandasを少しだけ味見してみよう。

データは下に添付ファイルとして置いてある。だいたい11行5列のデータだ。これを使ってもよいし、自分で作ったものを使ってもかまわない。
1) モジュールの呼び出しとファイル読み込み(read_excel)
まず、対象のファイルのパスにデータとJupyter Notebookファイルを一緒に置いておこう。

そして、次のようにコードを入力する。コードについての説明はコメントで付けてある。
# pandas を pd という名前で呼び出す
import pandas as pd
# 同じフォルダ内にある workout という Excel を読み込み、df という変数に格納
df = pd.read_excel("./workout.xlsx")
# df 変数を呼び出して確認
dfそしてdfを確認してみると、下のようにデータが入っていることが分かる。
本来なら print(df) を使うべきだが、Jupyter Notebook では変数を入力するだけでその値をすぐに確認できる。
では、このデータを噛んで、砕いて、味わって楽しんでみよう。

2) 確認(head, tail, index, columns)
今はデータが少ないので全て表示されているが、データが多いと一度に見るのが難しい。
そのような場合には、head や tail 関数と index を使っておおまかに値を確認できる。
(1) head
head は一番上のデータを出力してくれる。
上の [+ コード] を押すと入力セルが1つ追加される。

ここに下のコードを入力してみよう。
# データの一番上のデータを出力する(デフォルト5行)
# 前の df はデータフレームが入っている変数(オブジェクト)である。
df.head()
# 後ろのカッコの中には、参照したい行数を入力する。
df.head(3)下のような出力が出れば成功だ。
このようにして、データの一部を確認できる。

(2) tail
tail は一番下にあるデータを確認してくれる。
基本的には5件を出力するが、カッコの中に値を入れると、その数だけ出力してくれる。
head と使い方は同じだ。
# データの一番下のデータを出力する。
df.tail()
# カッコの中には、参照したい行数を入力する。
df.tail(3)初心者向けに補足すると、カッコの中に渡す値をパラメータと呼ぶ。

(3) index
index は、データの個数とその形を簡単に出力してくれる。
おおよそのデータ量を確認したいときに便利だ。
df.index
3) 並べ替え(sort_values, sort_index, reset_index)
(1) sort_values
sort_values は、値を昇順または降順に並べ替える。
オブジェクトが入っている変数の後ろに、次のような形で入力すると、簡単に並べ替えができる。
# 変数名.sort_values("列名")
df.sort_values("名前")
2つ以上の列で並べ替えをしたいときには、カッコの中にリスト形式で列名を入れればよい。
# 入力したリストが ["수학". "이름"] なら、
# まず名前で並べ替え、その後に数学の点数で並べ替える。
# リストで前にあるほど、並べ替えの優先度が高い。
df.sort_values(["수학","이름"])
デフォルトでは昇順ソートになる。
降順でソートしたい場合は、パラメータを1つ追加すればよい。
# ascending を False にすると降順で並べ替えられる。
# リストの前に by=[] を付けて、パラメータの役割を明示することもできる。
df.sort_values(["수학","이름"], ascending=False)
df.sort_values(by=["수학","이름"], ascending=False)
ちなみに、このようにした後で元のデータを確認すると、最初と同じままであることが分かる。
これは、並べ替えたデータを df に再代入していないために起きる問題だ。
解決方法は2つある。
新しい変数に代入する
inplace = True というパラメータを追加する
新しい変数に代入すると、下のようになるだろう。

inplace=True というパラメータを追加した場合は、既存の変数が上書きされる。

(2) sort_index
sort_index は、その名の通りインデックスに従って並べ替える。次のようにコードを入力してみよう。
# 新しい変数に代入する場合
df3 = df.sort_index()
df3
# inplace パラメータを使う場合
df.sort_index(inplace=True)
df出力を見ると、インデックスに従って最初の状態と同じように並べ替えられていることが分かる。

(3) reset_index
reset_index はインデックスを新たに指定し直す。
sort_values で並べ替えを行った後、新しくインデックスを振り直したいときは、次のようにコードを入力する。
# 地学の点数に従って昇順に並べ替え、既存の変数に保存
df.sort_values("지구과학", inplace=True)
# インデックスを振り直し、元のインデックスは捨てる。既存の変数に保存
df.reset_index(drop=True, inplace=True)
# 出力してみる
df下のように、地学の点数に従って昇順で並び、その後インデックスが振り直されていることが分かる。
もし元のインデックスを残しておきたいなら、drop パラメータを外せばよい。

4) 削除(drop, dropna)
(1) drop
この関数は、指定した行や列を削除する際に使用する。
削除したいindex と columns をパラメータとして受け取る。
調べてみると axis など、さまざまな指定方法があるが、使っているうちに自分にとって分かりやすくて使いやすい方法を使うようになる。
# drop はパラメータとしていろいろ受け取るが、index と columns で指定するのが最も楽だ。
# 2番目の行を削除
df.drop(index=1, inplace=True)
df
# 数学、英語の列を削除
df.drop(columns=["수학","영어"], inplace=True)
dfまずインデックスが1の行を削除してみると、下のように出力される。

次に、数学と英語の列を削除してみよう。columns というパラメータを指定し、リスト形式で値を渡せばよい。

(2) dropna
dropna は、値の入っていない行を削除する。
一般に欠損値の削除と呼ばれる。
ここでは numpy を使って、一時的に適当な欠損値を作ってみた。
下のコード自体はよく分からなくてもよい。
ざっくり言うと、4行目3列目の値を欠損値に変えるコードである。

データを呼び出したときにNaN と表示されていれば、その値は抜け落ちているということだ。Not a Number の略である。
では、値のない行を削除してみよう。
df.dropna(inplace=True)
df
地学の成績が入っていない「이서」が削除されていることが確認できる。
あるいは、NaN の値を 0 や他の数値に置き換えることもできる。
ここでは、そこまでのレベルは扱わない。
5) 行列の抽出(loc, iloc, 簡単な方法)
データを扱うとき、欲しい行や列だけを使うことができる。
このときは、loc と iloc を使う。
(1) loc
loc は location の略である。
loc の後に、ディクショナリのキーを指定するのと同じように、行と列の範囲を指定してやればよい。
# df.loc[行インデックスの範囲, 列インデックスの範囲]
df.loc[0:3,"이름":"국어"]
dfインデックスや列名は、その名前をそのまま入力すればよい。
今は行インデックスは数字、列インデックスは韓国語なので、このように入力すると、その範囲までを出力してくれる。

もし、インデックスが3の行から後ろの「名前」と「地学」だけを出力したいなら、次のように入力できる。
df.loc[3:,["이름","지구과학"]]
df連続したデータはコロン(:)を使って指定し、連続していないデータはリスト形式で指定する。

(2) iloc
iloc は integer location の略である。
loc と機能自体は同じだが、行と列の位置を数字で受け取る。
例えば、上と同じように、インデックスが3の行からの「名前」と「地学」を出力したい場合は、次のように入力する。
df.iloc[2:,[0,2]]
df
よく見ると、loc では行のパラメータに 3 を指定し、iloc では行のパラメータに 2 を指定していることが分かる。

loc では、インデックスが3の行から出力しており、iloc では0行目、1行目を飛ばして2行目から出力している、という違いだ。
(3) 簡単な方法
変数の後ろに、単純にディクショナリのように角カッコ[] を付けてデータを参照することもできる。
もし 0〜3 行目の「名前」と「地学」列だけを見たいなら、次のように入力できる。
# 変数の後ろに単純に [] だけを使ってデータを参照することもできる。
df[0:4][["이름","지구과학"]]
df
今度は、「名前」を1回参照してみよう。
「名前」が入っている列インデックスは "이름" なので、次のように簡単に入力できる。
df["이름"]
実際に使ってみると分かるが、この方法はデータを変更しようとしたときにエラーを引き起こすことがある。
したがって、値を変更したい場合には loc か iloc を使うことを勧める。
6) 条件式
(1) 単一条件式
条件式は、指定した条件に合うデータを探してくれる。
Excel のフィルタ機能と同じだと考えればよい。
例えば、地学が90点を超える生徒を探すとしたら、次のように入力できる。
df["지구과학"] > 90このように入力すると、テーブル内のすべてのセルを走査して、条件に対する True / False を返す。

これをもう一度データフレームに当てはめると、Pandas は True の行だけを出力する、という仕組みだ。
# loc を使って条件式を書く場合(推奨)
df.loc[df["지구과학"]>90]
# もう少し簡単な方法を使う場合
df[df["지구과학"]>90]どちらの方法でも出力は大きく変わらないので、好きな方を使えばよい。
私たちの目標はPandasを極めることではないからだ。
まずやってみて、エラーが出たらそのときに方法を変えても遅くはない。


(2) 複数条件式
複数の条件を与えることもできる。
df.loc[(df["지구과학"]>90) & (df["영어"]>90)]2つの条件をどちらも満たす値を探したいときは、2つの条件をカッコでくくって、その間に & 記号を入れる。
and と書くとエラーになる。

2つの条件のうちどちらか一方でも満たす値を探したいときは、| を入力する。
同様に or と書くとエラーになる。
df.loc[(df["지구과학"]>90) | (df["영어"]>90)]
条件に合う値の中から、見たい列だけを参照することもできる。
df.loc[(df["지구과학"]>90) | (df["영어"]>90), ["이름","영어" "지구과학"]]
7) その他の便利な機能(columns, unique)
データ可視化を行うとき、それがどの項目の値なのかを凡例として表現しなければならない場合が多い。
そのようなときには、columns で列インデックスを参照したり、unique 関数で重複しない値だけを返してもらうことができる。
(1) columns
データの列インデックスを参照するときに使う。
df.columnsデータを新たに読み込んでからインデックスを確認すると、下のような出力が見られる。

もし、生徒の名前を除いた国語・数学・英語・地学の点数をグラフにするときに、凡例をすべて手入力することなく、楽に指定できる。

(2) unique
この関数は、データ値の重複を取り除き、一意な値だけを返す。
まず、地学の成績を確認してみよう。

地学の成績のユニークな値を出力してみる。
df["지구과학"].unique()このコードの出力を見ると、実際には99点の生徒が2人いるが、1つだけしか入っていないことが分かる。

配列の形で返されるので、順番に取り出して値を確認することもできる。

3. おわりに
今回の記事では、Pandasを使ってデータを処理する方法について見てきた。
基礎的な内容だけを扱ったので、やや易しく感じられたかもしれない。
私たちの最初の目標はデータ前処理ではなく、整形されたデータを可視化することであることを覚えておこう。
次回の記事では、簡単なPandasの練習問題を解いてみる予定だ。
댓글을 불러오는 중...