pandasはデータサイエンス、データアナリシス、機械学習の分野で広く利用されているpythonのオープンソースパッケージです。
ある程度操作を覚えてしまうと非常に便利、柔軟、パワフルなツールですが、スキルとして身につくまで一苦労するのも事実です。
目次
Data Frame: データフレーム
まず例として使用するデータフレームを準備します。
今回、sklearnから”ボストン住宅価格のデータセット“を使用します。
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
boston = load_boston()
df = pd.DataFrame(boston.data, columns = boston.feature_names)
boston.data
、boston.feature_names
は、それぞれ「データ (506 x 13)」と「カラム名 (13, )」のndarray
です。
pd.DataFrame(data, columns)
から、データフレーム (df)
を作成しました。
df
Out:
CRIM ZN INDUS CHAS NOX ... RAD TAX PTRATIO B LSTAT
0 0.00632 18.0 2.31 0.0 0.538 ... 1.0 296.0 15.3 396.90 4.98
1 0.02731 0.0 7.07 0.0 0.469 ... 2.0 242.0 17.8 396.90 9.14
2 0.02729 0.0 7.07 0.0 0.469 ... 2.0 242.0 17.8 392.83 4.03
3 0.03237 0.0 2.18 0.0 0.458 ... 3.0 222.0 18.7 394.63 2.94
4 0.06905 0.0 2.18 0.0 0.458 ... 3.0 222.0 18.7 396.90 5.33
.. ... ... ... ... ... ... ... ... ... ... ...
501 0.06263 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 391.99 9.67
502 0.04527 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 396.90 9.08
503 0.06076 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 396.90 5.64
504 0.10959 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 393.45 6.48
505 0.04741 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 396.90 7.88
[506 rows x 13 columns]
データフレームが準備できました。次は欠損値がないか調べます。
Missing Data: 欠損データ
ここでは準備したデータに欠損値がないか確認します。欠損値はNan(Not a number)で表示されます。
df.isna().sum()
は各カラムにNanがいくつあるか確認します。
Out:
CRIM 0
ZN 0
INDUS 0
CHAS 0
NOX 0
RM 0
AGE 0
DIS 0
RAD 0
TAX 0
PTRATIO 0
B 0
LSTAT 0
dtype: int64
各カラムにNanは存在しないと確認できました。
データフレームdf
にNan
を含む場合
df.dropna()
は、Nanを含むローをデータフレームから除きます。
df.dropna(axis=1)
は、Nanを含むカラムをデータフレームから除きます。
Nanを何らかの数値に置き換えたい場合
df.fillna(0)
でNanを指定の値に置き換えます。 df.fillna(0)
は、Nanを0に置き換えます。
今回のデータセットに欠損値はありませんでしたね。
Summarizing: 要約
df.describe()
は統計情報の要約を実行します。
df.describe()
から各カラムの統計情報が得られます。得られる情報は、データ数(count)、平均値(mean)、標準偏差(std)、最小値(min)、第一四分位数(25%)、中央値(50%)、第三四分位数(75%)、最大値(max)です。
Out:
CRIM ZN INDUS ... PTRATIO B LSTAT
count 506.000000 506.000000 506.000000 ... 506.000000 506.000000 506.000000
mean 3.613524 11.363636 11.136779 ... 18.455534 356.674032 12.653063
std 8.601545 23.322453 6.860353 ... 2.164946 91.294864 7.141062
min 0.006320 0.000000 0.460000 ... 12.600000 0.320000 1.730000
25% 0.082045 0.000000 5.190000 ... 17.400000 375.377500 6.950000
50% 0.256510 0.000000 9.690000 ... 19.050000 391.440000 11.360000
75% 3.677083 12.500000 18.100000 ... 20.200000 396.225000 16.955000
max 88.976200 100.000000 27.740000 ... 22.000000 396.900000 37.970000
[8 rows x 13 columns]
df.describe()
を使うと一瞬で統計情報が得られるなんて便利ですね!
Indexing: 索引
ここでは索引の方法についてまとめます。
カラムを使った索引
カラムの索引はdf['colmn_name']
で実行します。例えば
df['CRIM']
は、データフレームからカラム名:’CRIM’のカラムを抽出します。
Out:
0 0.00632
1 0.02731
2 0.02729
3 0.03237
4 0.06905
...
501 0.06263
502 0.04527
503 0.06076
504 0.10959
505 0.04741
Name: CRIM, Length: 506, dtype: float64
複数のカラム、例えば、’CRIM’と’ZN’のカラムを抽出したい場合、
df[['CRIM','ZN']]
で目的のカラムを抽出します。
Out:
CRIM ZN
0 0.00632 18.0
1 0.02731 0.0
2 0.02729 0.0
3 0.03237 0.0
4 0.06905 0.0
.. ... ...
501 0.06263 0.0
502 0.04527 0.0
503 0.06076 0.0
504 0.10959 0.0
505 0.04741 0.0
[506 rows x 2 columns]
ローを使った索引
ローの索引はdf.iloc['row_index']
で実行します。例えば
df.iloc[[1,2]]
はrow indexが1と2の2つを返します。
Out:
CRIM ZN INDUS CHAS NOX ... RAD TAX PTRATIO B LSTAT
1 0.02731 0.0 7.07 0.0 0.469 ... 2.0 242.0 17.8 396.90 9.14
2 0.02729 0.0 7.07 0.0 0.469 ... 2.0 242.0 17.8 392.83 4.03
Filtering: フィルター
条件を満たすデータを抽出するフィルタリングについてまとめます。
単一条件
例えば、「CRIMが1以上」でフィルターをかけたい場合
df[df['CRIM'] > 1]
から
Out:
CRIM ZN INDUS CHAS NOX ... RAD TAX PTRATIO B LSTAT
16 1.05393 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 386.85 6.58
20 1.25179 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 376.57 21.02
22 1.23247 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 396.90 18.72
29 1.00245 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 380.23 11.98
30 1.13081 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 360.17 22.60
.. ... ... ... ... ... ... ... ... ... ... ...
483 2.81838 0.0 18.10 0.0 0.532 ... 24.0 666.0 20.2 392.92 10.42
484 2.37857 0.0 18.10 0.0 0.583 ... 24.0 666.0 20.2 370.73 13.34
485 3.67367 0.0 18.10 0.0 0.583 ... 24.0 666.0 20.2 388.62 10.58
486 5.69175 0.0 18.10 0.0 0.583 ... 24.0 666.0 20.2 392.68 14.98
487 4.83567 0.0 18.10 0.0 0.583 ... 24.0 666.0 20.2 388.22 11.45
[174 rows x 13 columns]
を取得できます。条件を満たす174のローが抽出されました。
複数条件
複数条件として「CRIMが1以上」かつ「RAD == 4」を試します。この場合、
df[(df['CRIM'] > 1)&(df['RAD']==4)]
から
Out:
CRIM ZN INDUS CHAS NOX ... RAD TAX PTRATIO B LSTAT
16 1.05393 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 386.85 6.58
20 1.25179 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 376.57 21.02
22 1.23247 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 396.90 18.72
29 1.00245 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 380.23 11.98
30 1.13081 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 360.17 22.60
31 1.35472 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 376.73 13.04
32 1.38799 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 232.60 27.71
33 1.15172 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 358.77 18.35
34 1.61282 0.0 8.14 0.0 0.538 ... 4.0 307.0 21.0 248.31 20.34
131 1.19294 0.0 21.89 0.0 0.624 ... 4.0 437.0 21.2 396.90 12.26
141 1.62864 0.0 21.89 0.0 0.624 ... 4.0 437.0 21.2 396.90 34.41
310 2.63548 0.0 9.90 0.0 0.544 ... 4.0 304.0 18.4 350.45 12.64
[12 rows x 13 columns]
が得られます。条件を満たすローの数は12でした。
Dropping Row/Column: 行/列の削除
指定のロー・カラムを削除するためにdf.drop()
を使用します。デフォルトは、ローを削除するaxis=0
に設定されています。
ローを削除する場合、削除するindexを指定します。例えば
df.drop([0,1,2])
でindex0,1,2の3行が削除されます。
Out:
CRIM ZN INDUS CHAS NOX ... RAD TAX PTRATIO B LSTAT
3 0.03237 0.0 2.18 0.0 0.458 ... 3.0 222.0 18.7 394.63 2.94
4 0.06905 0.0 2.18 0.0 0.458 ... 3.0 222.0 18.7 396.90 5.33
5 0.02985 0.0 2.18 0.0 0.458 ... 3.0 222.0 18.7 394.12 5.21
6 0.08829 12.5 7.87 0.0 0.524 ... 5.0 311.0 15.2 395.60 12.43
7 0.14455 12.5 7.87 0.0 0.524 ... 5.0 311.0 15.2 396.90 19.15
.. ... ... ... ... ... ... ... ... ... ... ...
501 0.06263 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 391.99 9.67
502 0.04527 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 396.90 9.08
503 0.06076 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 396.90 5.64
504 0.10959 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 393.45 6.48
505 0.04741 0.0 11.93 0.0 0.573 ... 1.0 273.0 21.0 396.90 7.88
[503 rows x 13 columns]
続いて指定のカラムを削除します。CRIMとZNを削除する場合
df.drop(['CRIM','ZN'],axis=1)
で目的のカラムを落としたデータセットが得られます。
Out:
INDUS CHAS NOX RM AGE ... RAD TAX PTRATIO B LSTAT
0 2.31 0.0 0.538 6.575 65.2 ... 1.0 296.0 15.3 396.90 4.98
1 7.07 0.0 0.469 6.421 78.9 ... 2.0 242.0 17.8 396.90 9.14
2 7.07 0.0 0.469 7.185 61.1 ... 2.0 242.0 17.8 392.83 4.03
3 2.18 0.0 0.458 6.998 45.8 ... 3.0 222.0 18.7 394.63 2.94
4 2.18 0.0 0.458 7.147 54.2 ... 3.0 222.0 18.7 396.90 5.33
.. ... ... ... ... ... ... ... ... ... ... ...
501 11.93 0.0 0.573 6.593 69.1 ... 1.0 273.0 21.0 391.99 9.67
502 11.93 0.0 0.573 6.120 76.7 ... 1.0 273.0 21.0 396.90 9.08
503 11.93 0.0 0.573 6.976 91.0 ... 1.0 273.0 21.0 396.90 5.64
504 11.93 0.0 0.573 6.794 89.3 ... 1.0 273.0 21.0 393.45 6.48
505 11.93 0.0 0.573 6.030 80.8 ... 1.0 273.0 21.0 396.90 7.88
[506 rows x 11 columns]
カラムを落とす場合、axis=1
にする必要があります。
「カラム:縦方向に落とすから数字の1!」って語呂合わせで覚えています。
Sorting: ソート
カラムの値でソートするために、df.sort_values()
を利用します。デフォルトではascending=True
に設定されており、昇順でソートされます。
例えば、’CRIM’を昇順でソートする場合
df.sort_values(by=['CRIM'])
でソートされた結果が得られます。
Out:
CRIM ZN INDUS CHAS NOX ... RAD TAX PTRATIO B LSTAT
0 0.00632 18.0 2.31 0.0 0.538 ... 1.0 296.0 15.3 396.90 4.98
284 0.00906 90.0 2.97 0.0 0.400 ... 1.0 285.0 15.3 394.72 7.85
285 0.01096 55.0 2.25 0.0 0.389 ... 1.0 300.0 15.3 394.72 8.23
341 0.01301 35.0 1.52 0.0 0.442 ... 1.0 284.0 15.5 394.74 5.49
55 0.01311 90.0 1.22 0.0 0.403 ... 5.0 226.0 17.9 395.93 4.81
.. ... ... ... ... ... ... ... ... ... ... ...
414 45.74610 0.0 18.10 0.0 0.693 ... 24.0 666.0 20.2 88.27 36.98
410 51.13580 0.0 18.10 0.0 0.597 ... 24.0 666.0 20.2 2.60 10.11
405 67.92080 0.0 18.10 0.0 0.693 ... 24.0 666.0 20.2 384.97 22.98
418 73.53410 0.0 18.10 0.0 0.679 ... 24.0 666.0 20.2 16.45 20.62
380 88.97620 0.0 18.10 0.0 0.671 ... 24.0 666.0 20.2 396.90 17.21
[506 rows x 13 columns]
これに対し、降順でソートする場合はascending=False
を指定します。
df.sort_values(by=['CRIM'], ascending=False)
以下、降順でソートされた結果が得られます。
Out:
CRIM ZN INDUS CHAS NOX ... RAD TAX PTRATIO B LSTAT
380 88.97620 0.0 18.10 0.0 0.671 ... 24.0 666.0 20.2 396.90 17.21
418 73.53410 0.0 18.10 0.0 0.679 ... 24.0 666.0 20.2 16.45 20.62
405 67.92080 0.0 18.10 0.0 0.693 ... 24.0 666.0 20.2 384.97 22.98
410 51.13580 0.0 18.10 0.0 0.597 ... 24.0 666.0 20.2 2.60 10.11
414 45.74610 0.0 18.10 0.0 0.693 ... 24.0 666.0 20.2 88.27 36.98
.. ... ... ... ... ... ... ... ... ... ... ...
55 0.01311 90.0 1.22 0.0 0.403 ... 5.0 226.0 17.9 395.93 4.81
341 0.01301 35.0 1.52 0.0 0.442 ... 1.0 284.0 15.5 394.74 5.49
285 0.01096 55.0 2.25 0.0 0.389 ... 1.0 300.0 15.3 394.72 8.23
284 0.00906 90.0 2.97 0.0 0.400 ... 1.0 285.0 15.3 394.72 7.85
0 0.00632 18.0 2.31 0.0 0.538 ... 1.0 296.0 15.3 396.90 4.98
[506 rows x 13 columns]
複数のカラムでソートも可能です。この場合、
df.sort_values(by=['ZN','CRIM'])
から
Out:
CRIM ZN INDUS CHAS NOX ... RAD TAX PTRATIO B LSTAT
342 0.02498 0.0 1.89 0.0 0.5180 ... 1.0 422.0 15.9 389.96 8.65
2 0.02729 0.0 7.07 0.0 0.4690 ... 2.0 242.0 17.8 392.83 4.03
1 0.02731 0.0 7.07 0.0 0.4690 ... 2.0 242.0 17.8 396.90 9.14
5 0.02985 0.0 2.18 0.0 0.4580 ... 3.0 222.0 18.7 394.12 5.21
337 0.03041 0.0 5.19 0.0 0.5150 ... 5.0 224.0 20.2 394.81 10.56
.. ... ... ... ... ... ... ... ... ... ... ...
200 0.01778 95.0 1.47 0.0 0.4030 ... 3.0 402.0 17.0 384.30 4.45
204 0.02009 95.0 2.68 0.0 0.4161 ... 4.0 224.0 14.7 390.55 2.88
199 0.03150 95.0 1.47 0.0 0.4030 ... 3.0 402.0 17.0 396.90 4.56
203 0.03510 95.0 2.68 0.0 0.4161 ... 4.0 224.0 14.7 392.78 3.81
57 0.01432 100.0 1.32 0.0 0.4110 ... 5.0 256.0 15.1 392.90 3.95
[506 rows x 13 columns]
が得られます。
Save: 保存
データフレームをcsvで保存したい場合、df.to_csv(path_filename)
を使用します。例えば、
df.to_csv('path/filename.csv')
は指定したpath
にファイル名: filename.csv
を保存します。
まとめ
基本操作としてまとめましたが、ここに記載した以外の方法もたくさんあります。いろんなコードを見て、書いて、身につけたいです。
この記事は以上です。最後まで読んで頂きありがとうございました。
参考資料
(1) Boston Dataset
(2) scikit-learn, “sklearn.datasets.load_boston”
(3) pandas.DataFrame
(8) pandas.DataFrame.sort_values
この記事は「データ分析の際に頻繁に利用するpandasの基本操作」をまとめます。