pandas: データ分析に役立つ操作まとめ

pandasはデータサイエンス、データアナリシス、機械学習の分野で広く利用されているpythonのオープンソースパッケージです。

ある程度操作を覚えてしまうと非常に便利、柔軟、パワフルなツールですが、スキルとして身につくまで一苦労するのも事実です。

ワカメさん

この記事は「データ分析の際に頻繁に利用するpandasの基本操作」をまとめます。

この記事がカバーする内容
  • データフレームの作成
  • 欠損値の除去
  • 統計情報の取得
  • 対象の検索
  • 対象の削除
  • ソート
  • データフレームの保存
スポンサーリンク

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.databoston.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は存在しないと確認できました。

データフレームdfNanを含む場合

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

(4) pandas.DataFrame.isna

(5) pandas.DataFrame.describe

(6) pandas.DataFrame.iloc

(7) pandas.DataFrame.drop

(8) pandas.DataFrame.sort_values

(9) pandas.DataFrame.to_csv

スポンサーリンク
この記事が気にいったらシェアしてね!
0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
ABOUT US
ワカメ
Data Scientist, Master of Data Science & Master of Engineering in Material Science
このブログは以下2点を目的に運営.
1. 管理人の学び・体験の復習機会
2. 海外留学を目指す方の参考情報
趣味の範囲で淡々と更新します.
*ブログ・SNSは所属組織と無関係の個人発信.