概要
DataFrameの規模、格納されているデータの概要や基礎統計量を概観する各種の手順。Scikit-learnのBoston housingデータセットを例にする。
DataFrameの規模・形状
size
プロパティーで全データ数、shape
プロパティーで行数と列数を確認。
1 2 3 4 5 6 7 8 9 10 11 |
import pandas as pd from sklearn.datasets import load_boston ds = load_boston() df = pd.DataFrame(ds.data, columns=ds.feature_names) print(df.size) # 6578 print(df.shape) # (506, 13) |
データの先頭部分と末尾部分
head()
メソッド/tail()
メソッドで先頭/末尾の5行分が得られる。引数で抜き出す行数を指定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
print(df.head()) # 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 # # [5 rows x 13 columns] print(df.tail(3)) # CRIM ZN INDUS CHAS NOX ... RAD TAX PTRATIO B LSTAT # 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 # # [3 rows x 13 columns] |
info()
~各列の基本情報の表示
info()
メソッドは、DataFrameの概要に関する概略情報を出力する。直接標準出力にプリントする点に注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
df.info() # <class 'pandas.core.frame.DataFrame'> # RangeIndex: 506 entries, 0 to 505 # Data columns (total 13 columns): # # Column Non-Null Count Dtype # --- ------ -------------- ----- # 0 CRIM 506 non-null float64 # 1 ZN 506 non-null float64 # 2 INDUS 506 non-null float64 # 3 CHAS 506 non-null float64 # 4 NOX 506 non-null float64 # 5 RM 506 non-null float64 # 6 AGE 506 non-null float64 # 7 DIS 506 non-null float64 # 8 RAD 506 non-null float64 # 9 TAX 506 non-null float64 # 10 PTRATIO 506 non-null float64 # 11 B 506 non-null float64 # 12 LSTAT 506 non-null float64 # dtypes: float64(13) # memory usage: 51.5 KB |
たとえば一部にNaNが含まれる場合の出力は以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import numpy as np df1 = pd.DataFrame(np.arange(15).reshape(-1, 3), columns=["a", "b", "c"]) df1.loc[1, "b"] = np.nan df1.loc[3, "c"] = np.nan df1.info() # <class 'pandas.core.frame.DataFrame'> # RangeIndex: 5 entries, 0 to 4 # Data columns (total 3 columns): # # Column Non-Null Count Dtype # --- ------ -------------- ----- # 0 a 5 non-null int32 # 1 b 4 non-null float64 # 2 c 4 non-null float64 # dtypes: float64(2), int32(1) # memory usage: 228.0 bytes |
dscribe()
~基本的な統計量
describe()
メソッドは、各列のデータについて、個数や平均といった基本的な統計量を計算する。
1 2 3 4 5 6 7 8 9 10 11 |
print(df.describe()) # 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 |
特定の列の統計量を見たいときは列を指定。
なおstd(標準偏差)については、ddof=1を指定した結果と同じであり、n−1で割った不偏分散。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
print(df["CRIM"].describe()) # count 506.000000 # mean 3.613524 # std 8.601545 # min 0.006320 # 25% 0.082045 # 50% 0.256510 # 75% 3.677083 # max 88.976200 # Name: CRIM, dtype: float64 print(df["CRIM"].std(ddof=1)) # 8.60154510533249 |
全ての列を見たいときには、set_option()
メソッドの引数でdisplay.max_columns
パラメーターを指定する。初期値に戻すときはreset_option()
メソッド。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
pd.set_option('display.max_columns', 100) print(df.describe()) pd.reset_option('display.max_columns') # CRIM ZN INDUS CHAS NOX RM \ # count 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 # mean 3.613524 11.363636 11.136779 0.069170 0.554695 6.284634 # std 8.601545 23.322453 6.860353 0.253994 0.115878 0.702617 # min 0.006320 0.000000 0.460000 0.000000 0.385000 3.561000 # 25% 0.082045 0.000000 5.190000 0.000000 0.449000 5.885500 # 50% 0.256510 0.000000 9.690000 0.000000 0.538000 6.208500 # 75% 3.677083 12.500000 18.100000 0.000000 0.624000 6.623500 # max 88.976200 100.000000 27.740000 1.000000 0.871000 8.780000 # # AGE DIS RAD TAX PTRATIO B \ # count 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 # mean 68.574901 3.795043 9.549407 408.237154 18.455534 356.674032 # std 28.148861 2.105710 8.707259 168.537116 2.164946 91.294864 # min 2.900000 1.129600 1.000000 187.000000 12.600000 0.320000 # 25% 45.025000 2.100175 4.000000 279.000000 17.400000 375.377500 # 50% 77.500000 3.207450 5.000000 330.000000 19.050000 391.440000 # 75% 94.075000 5.188425 24.000000 666.000000 20.200000 396.225000 # max 100.000000 12.126500 24.000000 711.000000 22.000000 396.900000 # # LSTAT # count 506.000000 # mean 12.653063 # std 7.141062 # min 1.730000 # 25% 6.950000 # 50% 11.360000 # 75% 16.955000 # max 37.970000 |
属性変数のカウント
属性変数の属性値のカウントには、value_counts()
メソッドを使う。このメソッドは、ユニークな値の数をカウントして集計する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
print(df["CHAS"].value_counts()) # 0.0 471 # 1.0 35 # Name: CHAS, dtype: int64 print(df["RAD"].value_counts()) # 24.0 132 # 5.0 115 # 4.0 110 # 3.0 38 # 6.0 26 # 8.0 24 # 2.0 24 # 1.0 20 # 7.0 17 # Name: RAD, dtype: int64 |
2つの属性変数をファンシーインデックスで指定すると、「2つの属性のユニークな組み合わせ」の数が集計される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
print(df[["CHAS", "RAD"]].value_counts()) # CHAS RAD # 0.0 24.0 124 # 5.0 104 # 4.0 102 # 3.0 36 # 6.0 26 # 2.0 24 # 8.0 19 # 1.0 19 # 7.0 17 # 1.0 5.0 11 # 24.0 8 # 4.0 8 # 8.0 5 # 3.0 2 # 1.0 1 # dtype: int64 |