PandasはオープンソースのPythonパッケージで、データ解析のためのツールを多数提供しています。このパッケージには、多くの異なるデータ操作タスクに使用できるいくつかのデータ構造が付属しています。また、データ解析のために呼び出すことができる様々なメソッドを備えており、Pythonでデータサイエンスや機械学習の問題に取り組む際に便利です。
Pandasを利用するメリット
Pandasライブラリの利点として、以下のようなものがあります。
-
- データ構造として
Series
とDataFrame
を持ち、データ分析に適した形でデータを表示することができる。
- データ構造として
-
- パッケージには、データのフィルタリングに便利な複数のメソッドが含まれています。
-
- Pandasは、入出力操作をシームレスに行うための様々なユーティリティを備えています。CSV、TSV、MS Excel などの様々なフォーマットからデータを読み込むことができます。
Pandasのインストール
標準のPythonディストリビューションには、Pandasモジュールが付属していません。このサードパーティモジュールを使用するには、インストールする必要があります。
Pythonの良いところは、Pandasのインストールに使用できるpipというツールがバンドルされていることです。インストールするには、以下のコマンドを実行する必要があります。
$ pip install pandas
Anacondaがインストールされている場合は、以下のコマンドを実行するだけでPandasがインストールされます。
$ conda install pandas
Pandasパッケージの最新バージョンをインストールすることを強くお勧めします。しかし、もし古いバージョンをインストールしたい場合は、以下のように conda install
コマンドを実行して指定することができます。
$ conda install pandas=0.23.4
Pandasのデータ構造
Pandasはデータを格納するための2つの主要なデータ構造を持っています。
- シリーズ
- データフレーム
シリーズ
系列は一次元の配列に似ています。あらゆる型のデータを格納することができます。Pandas の Series
の値は変更可能ですが、 Series
のサイズは不変であり、変更することはできません。
シリーズの最初の要素にはインデックス 0
が割り当てられ、最後の要素にはインデックス N-1
が割り当てられます(ここで N
はシリーズ内の要素の総数)。
Pandasの Series
を作成するには、まずPythonの import
コマンドを使用してPandasパッケージをインポートする必要があります。
import pandas as pd
Pandas の Series
を作成するために、以下のように pd.Series()
メソッドを呼び出して、配列を渡します。
series1 = pd.Series([1,2,3,4])
次に、print
ステートメントを実行して、Series
の内容を表示します。
print(series1)
出力します。
出力: “`
0 1
1 2
2 3
3 4
dtype: int64
最初の列はインデックス `0` から始まる数字で、2番目の列はシリーズに追加された要素です。
最初の列は要素のインデックスを表しています。
しかし、`Series`を表示しようとすると、エラーが発生することがあります。このエラーの主な原因は、Pandasが表示する情報量を調べるため、sysの出力情報を提供しなければならないことです。
以下のようなコードを実行することで、このエラーを解決することができます。
import pandas as pd
import sys
sys.stdout = sys.stdout
series1 = pd.Series([1,2,3,4])
print(series1)
また、Seriesはnumpyの配列から作成することもできます。ここでは、numpy の配列を作成し、それを Pandas の `Series` に変換してみます。
import pandas as pd
import numpy as np
import sys
sys.stdout = sys.stdout
fruits = np.array([‘apple’,’orange’,’mango’,’pear’])
series2 = pd.Series(fruits)
print(series2)
出力
0 apple
1 orange
2 mango
3 pear
dtype: object
まず、`numpy`を含む必要なライブラリをインポートすることから始めます。次に、numpyの `array()` 関数を呼び出して、果物の配列を作成します。次に、Pandasの `Series()` 関数を使用して、シリーズに変換したい配列を渡します。最後に、`print()`関数を呼び出して `Series` を表示します。
#### データフレーム
PandasのDataFrameはテーブルと見なすことができます。データを行と列に整理し、2次元のデータ構造にしています。潜在的に、列は異なるタイプであり、DataFrameのサイズはmutableであり、それ故に変更することができます。
DataFrameを作成するには、ゼロから始めるか、Numpy配列のような他のデータ構造をDataFrameに変換するかを選択することができます。ここでは、ゼロからDataFrameを作成する方法を説明します。
import pandas as pd
df = pd.DataFrame({
“Column1”: [1, 4, 8, 7, 9],
“Column2”: [‘a’, ‘column’, ‘with’, ‘a’, ‘string’],
“Column3”: [1.23, 23.5, 45.6, 32.1234, 89.453],
“Column4”: [True, False, True, False, True]
})
print(df)
出力
Column1 Column2 Column3 Column4
0 1 a 1.2300 True
1 4 column 23.5000 False
2 8 with 45.6000 True
3 7 a 32.1234 False
4 9 string 89.4530 True
この例では、`df`という名前のDataFrameを作成しました。DataFrameの最初のカラムは整数値である。2列目は文字列、3列目は浮動小数点数、4列目はブーリアン値である。
print(df)` という文は、DataFrameの内容をコンソールに表示し、その内容を検査・確認することができる。
しかし、DataFrameを表示したときに、表の最初に0から始まる列が追加されていることに気づいたかもしれません。 この列は自動的に作成され、行のインデックスを表します。
DataFrameを作成するには、上記の例のように `pd.DataFrame()` メソッドを呼び出す必要があります。
リストやリストの集合からDataFrameを作成することも可能です。pd.DataFrame()`メソッドを呼び出して、リスト変数を唯一の引数として渡せばよいのです。
次の例を見てください。
import pandas as pd
mylist = [4, 8, 12, 16, 20]
df = pd.DataFrame(mylist)
print(df)
出力します。
0
0 4
1 8
2 12
3 16
4 20
この例では、5つの整数からなる `mylist` という名前のリストを作成しました。次に `DataFrame()` メソッドを呼び出して、リストの名前を引数として渡しました。ここで、リストからDataFrameへの変換が行われました。
そして、DataFrameの中身をプリントアウトしています。DataFrameはデフォルトでインデックスを示す列を持っており、最初の要素はインデックス0、最後の要素はインデックス `N-1` で、ここでNはDataFrameの要素の総数です。
以下は別の例です。
import pandas as pd
items = [[‘Phone’, 2000], [‘TV’, 1500], [‘Radio’, 800]]
df = pd.DataFrame(items, columns=[‘Item’, ‘Price’], dtype=float)
print(df)
出力
Item Price
0 Phone 2000.0
1 TV 1500.0
2 Radio 800.0
ここでは、3つの項目からなる `items` という名前のリストを作成しました。各アイテムには、名前と価格が設定されています。このリストを `DataFrame()` メソッドに渡すと、 `DataFrame` オブジェクトに変換されます。
この例では、DataFrame のカラムの名前も指定されています。また、引数 `dtype` に "float" を指定しているので、数値は浮動小数点値に変換されています。
この項目のデータの概要を得るには、DataFrame の変数である `df` に対して `describe()` 関数を呼び出すことができます。
df.describe()
出力されます。
Price
count 3.000000
mean 1433.333333
std 602.771377
min 800.000000
25% 1150.000000
50% 1500.000000
75% 1750.000000
max 2000.000000
describe()` 関数は、平均値、標準偏差、最小要素、最大要素など、データに関する一般的な統計情報の詳細を返します。これは、扱うデータセットが比較的未知のものである場合に、データのスナップショットを取得するのに最適な方法です。また、似たようなデータを持つ2つの別々のデータセットを素早く比較するのにも良い方法かもしれません。
### データのインポート
Pandasを使って、ExcelファイルやCSVファイルに保存されているデータを分析する必要があることがよくあります。この場合、そのようなソースからデータを開いて Pandas にインポートする必要があります。
幸いなことに、PandasはそのようなソースからPandas DataFrameにデータをロードするために使用できる多くのメソッドを提供しています。
#### CSVデータのインポート
CSV ファイルは comma separated value の略で、値をカンマ (,) で区切った単純なテキストファイルです。これは非常に有名でよく使われる規格なので、Pandas を使って CSV ファイルの全体または一部を読み込むことができます。
この例では、cars.csv という名前の CSV ファイルを作成します。このファイルには以下のデータが含まれているはずです。
Number,Type,Capacity
SSD,Premio,1800
KCN,Fielder,1500
USG,Benz,2200
TCH,BMW,2000
KBQ,Range,3500
TBD,Premio,1800
KCP,Benz,2200
USD,Fielder,1500
UGB,BMW,2000
TBG,Range,3200
データをコピーしてメモ帳などのテキストエディタにペーストし、cars.csvという名前でPythonスクリプトと同じディレクトリに保存してください。
PandasはCSVの値をPandas DataFrameに読み込むために使用できる `read_csv` という名前のメソッドを提供しています。このメソッドは CSV ファイルのパスを引数として受け取ります。
次のコードは cars.csv ファイルを読み込むために使用するものです。
import pandas as pd
data = pd.read_csv(‘cars.csv’)
print(data)
出力します。
Number Type Capacity
0 SSD Premio 1800
1 KCN Fielder 1500
2 USG Benz 2200
3 TCH BMW 2000
4 KBQ Range 3500
5 TBD Premio 1800
6 KCP Benz 2200
7 USD Fielder 1500
8 UGB BMW 2000
9 TBG Range 3200
私の場合、CSVファイルをPythonスクリプトと同じディレクトリに保存したので、`read_csv`メソッドにファイル名を渡すだけで、現在の作業ディレクトリをチェックすることがわかっています。
もし、ファイルを別のパスに保存した場合は、メソッドの引数に正しいパスを渡してください。これは "../cars.csv" のような相対パスでも、 "/Users/nicholas/data/cars.csv" のような絶対パスでもかまいません。
場合によっては、データセットが何千行にもなることもあります。そのような場合、すべての行を表示するよりも、最初の数行だけをコンソールに表示する方が便利である。
これは、以下のようにDataFrameの `head()` メソッドを呼び出すことで実現できます。
data.head()
上記のデータに対して、上記のコマンドはデータセットの最初の5行だけを返すので、データの小さなサンプルを検査することができます。これは以下のようになります。
出力
Number Type Capacity
0 SSD Premio 1800
1 KCN Fielder 1500
2 USG Benz 2200
3 TCH BMW 2000
4 KBQ Range 3500
loc()` メソッドは、次の例で示すように、データセットの特定の列の特定の行だけを読み出すのに役立つ素晴らしいユーティリティである。
import pandas as pd
data = pd.read_csv(‘cars.csv’)
print (data.loc[[0, 4, 7], [‘Type’]])
出力
Type
0 Premio
4 Range
7 Fielder
ここでは、`loc()` メソッドを使って、Type 列のインデックス 0, 4, 7 の要素だけを読み込んでいます。
時には、特定の列だけを読み込んで、他の列は読み込まないようにする必要があるかもしれません。この例では、以下のように `loc()` メソッドを使用しても可能です。
import pandas as pd
data = pd.read_csv(‘cars.csv’)
print (data.loc[:, [‘Type’, ‘Capacity’]])
出力します。
Type Capacity
0 Premio 1800
1 Fielder 1500
2 Benz 2200
3 BMW 2000
4 Range 3500
5 Premio 1800
6 Benz 2200
7 Fielder 1500
8 BMW 2000
9 Range 3200
ここでは、`loc()` メソッドを使って、引数で指定された Type と Capacity の 2 つの列のうち、すべての行(`:` 部分)だけをデータセットから読み込んでいます。
#### エクセルデータのインポート
Pandas には `read_csv` メソッドに加えて `read_excel` 関数があり、Excel データを Pandas DataFrame に読み込むために使用することができます。この例では、ある会社の労働者の詳細を含む workers.xlsx という名前の Excel ファイルを使用します。
次のコードは、Excel ファイルの内容を Pandas DataFrame に読み込むために使用されます。
import pandas as pd
data = pd.read_excel(‘workers.xlsx’)
print (data)
出力
ID Name Dept Salary
0 1 John ICT 3000
1 2 Kate Finance 2500
2 3 Joseph HR 3500
3 4 George ICT 2500
4 5 Lucy Legal 3200
5 6 David Library 2000
6 7 James HR 2000
7 8 Alice Security 1500
8 9 Bosco Kitchen 1000
9 10 Mike ICT 3300
read_excel` 関数を呼び出した後、引数としてファイル名を渡しました。この `read_excel` はファイルを開いて読み込み、データをパースするために使用されます。そして、 `print()` 関数は、過去の例で行ったように、DataFrame の内容を表示するのに役立ちます。
CSV の例と同様に、この関数を `loc()` メソッドと組み合わせることで、Excel ファイルから特定の行や列を読み込むことができます。
たとえば
import pandas as pd
data = pd.read_excel(‘workers.xlsx’)
print (data.loc[[1,4,7],[‘Name’,’Salary’]])
出力
Name Salary
1 Kate 2500
4 Lucy 3200
7 Alice 1500
インデックス1、4、7にある要素のNameとSalaryの値を取得するために `loc()` メソッドを使用しました。
Pandasでは、2つのExcelシートから同時に読み込むことも可能です。前のデータがSheet1にあり、同じExcelファイルのSheet2には他のデータがあるとします。次のコードは、2つのシートから同時に読み込む方法を示しています。
import pandas as pd
with pd.ExcelFile(‘workers.xlsx’) as x:
s1 = pd.read_excel(x, ‘Sheet1’)
s2 = pd.read_excel(x, ‘Sheet2’)
print(“Sheet 1:”)
print (s1)
print(“”)
print(“Sheet 2:”)
print (s2)
出力します。
Sheet 1:
ID Name Dept Salary
0 1 John ICT 3000
1 2 Kate Finance 2500
2 3 Joseph HR 3500
3 4 George ICT 2500
4 5 Lucy Legal 3200
5 6 David Library 2000
6 7 James HR 2000
7 8 Alice Security 1500
8 9 Bosco Kitchen 1000
9 10 Mike ICT 3300
Sheet 2:
ID Name Age Retire
0 1 John 55 2023
1 2 Kate 45 2033
2 3 Joseph 55 2023
3 4 George 35 2043
4 5 Lucy 42 2036
5 6 David 50 2028
6 7 James 30 2048
7 8 Alice 24 2054
8 9 Bosco 33 2045
9 10 Mike 35 2043
これは、 `read_excel()` 関数と `ExcelFile` ラッパークラスを組み合わせたものです。ラッパークラスと `with` Python キーワードを呼び出す際に変数 `x` を作成し、これを使用してファイルを一時的にオープンしています。
ExcelFile` の変数 `x` から、さらに 2 つの変数 `s1` と `s2` を作成して、異なるシートから読み込まれた内容を表現しています。
そして、`print`ステートメントを使って、2つのシートの内容をコンソールに表示しました。空白の `print` ステートメント、 `print("")` は、シートデータの間に空白行を表示するためだけに使用されます。
### データラングリング
データ整理とは、データを加工して次の工程で使用できるようにすることである。データ操作の例としては、マージ、グループ化、連結などがあります。このような操作はデータサイエンスにおいてしばしば必要とされ、データをどのような分析やアルゴリズムでもうまく機能するような形にするために行われる。
#### マージ
Pandasライブラリでは、`merge()`関数を用いてDataFrameオブジェクトを結合することができます。ここでは、2つのDataFrameを作成し、それらをマージする方法を説明します。
最初のDataFrameである `df1` は以下の通りです。
import pandas as pd
d = {
‘subject_id’: [‘1’, ‘2’, ‘3’, ‘4’, ‘5’],
‘student_name’: [‘John’, ‘Emily’, ‘Kate’, ‘Joseph’, ‘Dennis’]
}
df1 = pd.DataFrame(d, columns=[‘subject_id’, ‘student_name’])
print(df1)
出力
subject_id student_name
0 1 John
1 2 Emily
2 3 Kate
3 4 Joseph
4 5 Dennis
以下は、2番目のDataFrameである`df2`を作成するためのコードです。
import pandas as pd
data = {
‘subject_id’: [‘4’, ‘5’, ‘6’, ‘7’, ‘8’],
‘student_name’: [‘Brian’, ‘William’, ‘Lilian’, ‘Grace’, ‘Caleb’]
}
df2 = pd.DataFrame(data, columns=[‘subject_id’, ‘student_name’])
print(df2)
出力
subject_id student_name
0 4 Brian
1 5 William
2 6 Lilian
3 7 Grace
4 8 Caleb
次に、2つのDataFrame、つまり `df1` と `df2` を `subject_id` の値に沿ってマージする必要があります。以下のように、`merge()`関数を呼び出すだけです。
pd.merge(df1, df2, on=’subject_id’)
出力
subject_id student_name_x student_name_y
0 4 Joseph Brian
1 5 Dennis William
マージを行うと、両方の DataFrame から、マージに使用するカラムの値が同じ行が返されます。
どのデータをマージするか、どのようにマージするか、ソートするかなど、この記事では取り上げないが、他にも `pd.merge` 関数を使用する方法はたくさんある。より詳しい情報は、merge 関数の公式ドキュメントを参照してください。
#### グループ化
グループ化とは、データを様々なカテゴリーに分類することです。ここでは簡単な例を示します。
import pandas library
import pandas as pd
raw = {
‘Name’: [‘John’, ‘John’, ‘Grace’, ‘Grace’, ‘Benjamin’, ‘Benjamin’, ‘Benjamin’,
‘Benjamin’, ‘John’, ‘Alex’, ‘Alex’, ‘Alex’],
‘Position’: [2, 1, 1, 4, 2, 4, 3, 1, 3, 2, 4, 3],
‘Year’: [2009, 2010, 2009, 2010, 2010, 2010, 2011, 2012, 2011, 2013, 2013, 2012],
‘Marks’:[408, 398, 422, 376, 401, 380, 396, 388, 356, 402, 368, 378]
}
df = pd.DataFrame(raw)
group = df.groupby(‘Year’)
print(group.get_group(2010))
出力。
Marks Name Position Year
1 398 John 1 2010
3 376 Grace 4 2010
5 380 Benjamin 4 2010
この例では、データを年(この場合は2010年)でグループ分けしています。また、「名前」「役職」など、他の列でグループ化することも可能です。
#### 連結
データの連結は、基本的に `concat()` 関数を呼び出すことによって行うことができます。
ここでは、"subject_id" と "student_name" という二つのカラムを持つ `df1` と `df2` という二つのデータフレームを用いて、データフレームを連結する方法を説明します。
print(pd.concat([df1, df2]))
出力
subject_id student_name
0 1 John
1 2 Emily
2 3 Kate
3 4 Joseph
4 5 Dennis
0 4 Brian
1 5 William
2 6 Lilian
3 7 Grace
4 8 Caleb
### 記述統計量
先ほど簡単に説明したように、 `describe()` 関数を使用すると、数値列の記述統計量は得られますが、文字列は除外されます。
まず、生徒の名前と数学と英語の点数を表す DataFrame を作成しましょう。
import pandas as pd
data = {
‘Name’: [‘John’, ‘Alice’, ‘Joseph’, ‘Alex’],
‘English’: [64, 78, 68, 58],
‘Maths’: [76, 54, 72, 64]
}
df = pd.DataFrame(data)
print(df)
出力
English Maths Name
0 64 76 John
1 78 54 Alice
2 68 72 Joseph
3 58 64 Alex
このDataFrameに対して `describe()` 関数を呼び出すだけで、平均値、標準偏差、中央値、最大要素、最小要素などの様々な指標を得ることができます。
df.describe()
出力されます。
English Maths
count 4.000000 4.000000
mean 67.000000 66.500000
std 8.406347 9.712535
min 58.000000 54.000000
25% 62.500000 61.500000
50% 66.000000 68.000000
75% 70.500000 73.000000
max 78.000000 76.000000
“`
見ての通り、describe()
メソッドは “Name” カラムを完全に無視しています。なぜなら、このカラムは私たちが欲しいような数値的なものではないためです。これは、数値的な統計量を計算する前に数値以外のカラムを削除することを心配する必要がないため、呼び出し側にとっては単純なことです。
結論
Pandasは、特にデータサイエンスにおいて非常に有用なPythonライブラリです。Pandasの様々な機能により、データの前処理を非常に簡単に行うことができます。この記事では、ライブラリの主な機能を簡単に紹介します。この記事では、Pandasライブラリのすべての主要なユーティリティの動作例を見ました。Pandasを最大限に活用するために、この記事の例を練習し、自分のデータセットでライブラリーをテストすることをお勧めします。それでは、Happy Coding!