4.1. ファイル処理#

4.1.1. データの読み込み#

データを属性ごとにカンマで区切って整形した形式を CSVcomma-separated values)フォーマットと呼びます。また、カンマの代わりにタブ文字で区切った形式は TSVtab-separated values)フォーマットと呼ばれます。こうした整形済みのファイルを読み込む際には、Pandas モジュールの機能を利用すると便利です。

たとえば、CSV ファイルを読み込むには、pd.read_csv 関数にファイルのパスを指定して実行するだけです。この関数を使って読み込まれたデータは、データフレームDataFrame)と呼ばれる Pandas 独自のデータ型で保存されます。データフレームでは、行と列が明確に区別されており、それぞれが CSV ファイルの行と列に対応しています。データフレーム型に対しては、特定の列や行の抽出、条件に一致する行の抽出、統計量の計算など、さまざまな操作を簡単に行うことができます。

では実際に、どんぐりの重さを記録したデータを読み込んでみましょう。このデータは acorns.clean.csv という名前で保存されており、CSV フォーマットになっています。

# !wget https://py.biopapyrus.jp/data/acorns.clean.csv
x = pd.read_csv('acorns.clean.csv')

何も表示されない場合は、データが正しく読み込まれ、変数 x に代入されたことを意味します。ただし、もし次のようなエラーが表示された場合には、それぞれに応じた対処が必要です。

  • NameError: name 'pd' is not defined
    このエラーは、Pandas モジュールが正しくインポートされていないことが原因です。Pandas をインポートしてから、再度ファイルの読み込みを実行してください。

  • FileNotFoundError: [Errno 2] No such file or directory: 'acorns.csv'
    このエラーは、指定されたファイルが見つからないことを意味します。ファイル名やパスが間違っている可能性があります。使用している OS やファイルを保存した場所によっては、コード例にあるような単純なファイル名では読み込めない場合があります。ファイルが存在する正確なパスを確認し、それを指定してください。

なお、オプションを指定せずに読み込むと、ファイルの最初の行はヘッダー行として認識され、その値がデータフレームの列名として自動的に設定されます。もしファイルにヘッダー行が含まれていない場合は、次のように header=None を指定して読み込む必要があります。

# !wget https://py.biopapyrus.jp/data/acorns.clean.nh.csv
x = pd.read_csv('acorns.clean.nh.csv', header=None)

また、ファイル内にデータとは無関係なメタデータやコメント行が含まれている場合は、comment オプションを使って無視することができます。たとえば、# で始まる行をコメントとして無視するには、次のようにします。

# !wget https://py.biopapyrus.jp/data/acorns.clean.meta.csv
x = pd.read_csv('acorns.clean.meta.csv', comment='#')

CSV フォーマットではなく、タブ区切りの TSV フォーマットの場合は sep オプションで区切り文字をタブ(\t)に指定します。

# !wget https://py.biopapyrus.jp/data/acorns.clean.tsv
x = pd.read_csv('acorns.clean.tsv', sep='\t')

このように、pd.read_csv 関数は柔軟なオプションを備えており、さまざまな形式の CSV ファイルを簡単に読み込むことができます。

4.1.2. データの確認#

Pandas で読み込まれたデータを print 関数で出力させると、次のように表示されます。

x = pd.read_csv('acorns.clean.csv')
print(x)
          tree  weight  height  diameter
0       kunugi    5.55    2.27      1.89
1       kunugi    4.62    1.98      1.84
2       kunugi    5.05    2.08      1.90
3       kunugi    5.44    2.18      1.91
4       kunugi    5.60    2.20      1.93
5       kunugi    4.83    2.19      1.85
6       kunugi    5.55    2.16      2.00
7       kunugi    5.13    2.20      1.87
8       kunugi    6.03    2.26      2.01
9       kunugi    7.41    2.35      2.12
10      konara    1.60    2.11      1.10
11      konara    1.49    2.04      1.09
12      konara    1.74    2.30      1.17
13      konara    1.57    2.11      1.11
14      konara    1.88    2.33      1.11
15      konara    1.63    2.12      1.14
16      konara    1.45    2.06      1.09
17      konara    1.07    1.91      0.98
18      konara    1.53    2.17      1.17
19      konara    1.61    2.00      1.12
20  matebashii    2.96    2.75      1.35
21  matebashii    3.18    2.80      1.44
22  matebashii    3.08    2.73      1.42
23  matebashii    2.89    2.78      1.38
24  matebashii    3.68    2.83      1.51
25  matebashii    2.93    2.62      1.38
26  matebashii    2.30    2.50      1.26
27  matebashii    3.18    2.68      1.46
28  matebashii    3.13    2.76      1.40
29  matebashii    2.20    2.54      1.21
30  shirakashi    1.76    1.95      1.23
31  shirakashi    1.96    2.06      1.23
32  shirakashi    1.77    1.93      1.24
33  shirakashi    1.88    2.07      1.25
34  shirakashi    1.70    1.97      1.20
35  shirakashi    1.78    2.09      1.20
36  shirakashi    1.82    1.97      1.24
37  shirakashi    1.70    1.95      1.20
38  shirakashi    1.56    1.98      1.13
39  shirakashi    1.90    2.06      1.25
40  shirakashi    1.37    1.89      1.09
41  shirakashi    2.01    1.94      1.39
42  shirakashi    2.12    1.97      1.32
43  shirakashi    1.89    2.03      1.26
44  shirakashi    1.87    2.06      1.22
45    arakashi    1.68    1.89      1.23
46    arakashi    1.42    1.87      1.12
47    arakashi    1.54    1.82      1.15
48    arakashi    1.30    1.77      1.19
49    arakashi    1.53    1.81      1.18
50    arakashi    1.47    1.85      1.13
51    arakashi    1.64    1.89      1.26
52    arakashi    1.44    1.81      1.14
53    arakashi    1.36    1.87      1.09
54    arakashi    1.56    1.90      1.17
55    arakashi    1.49    1.82      1.17
56    arakashi    1.51    1.84      1.16
57    arakashi    1.41    1.88      1.12
58    arakashi    1.48    1.83      1.17

Jupyter Notebook を使用している場合、変数名を実行するだけで、その変数の中身が表示されます。この場合、Jupyter Notebook 独自の機能により、出力が見やすく整形されます。ただし、通常の Python 実行環境(たとえばターミナルや他のエディタ)では、同じような出力は得られません。

x
tree weight height diameter
0 kunugi 5.55 2.27 1.89
1 kunugi 4.62 1.98 1.84
2 kunugi 5.05 2.08 1.90
3 kunugi 5.44 2.18 1.91
4 kunugi 5.60 2.20 1.93
5 kunugi 4.83 2.19 1.85
6 kunugi 5.55 2.16 2.00
7 kunugi 5.13 2.20 1.87
8 kunugi 6.03 2.26 2.01
9 kunugi 7.41 2.35 2.12
10 konara 1.60 2.11 1.10
11 konara 1.49 2.04 1.09
12 konara 1.74 2.30 1.17
13 konara 1.57 2.11 1.11
14 konara 1.88 2.33 1.11
15 konara 1.63 2.12 1.14
16 konara 1.45 2.06 1.09
17 konara 1.07 1.91 0.98
18 konara 1.53 2.17 1.17
19 konara 1.61 2.00 1.12
20 matebashii 2.96 2.75 1.35
21 matebashii 3.18 2.80 1.44
22 matebashii 3.08 2.73 1.42
23 matebashii 2.89 2.78 1.38
24 matebashii 3.68 2.83 1.51
25 matebashii 2.93 2.62 1.38
26 matebashii 2.30 2.50 1.26
27 matebashii 3.18 2.68 1.46
28 matebashii 3.13 2.76 1.40
29 matebashii 2.20 2.54 1.21
30 shirakashi 1.76 1.95 1.23
31 shirakashi 1.96 2.06 1.23
32 shirakashi 1.77 1.93 1.24
33 shirakashi 1.88 2.07 1.25
34 shirakashi 1.70 1.97 1.20
35 shirakashi 1.78 2.09 1.20
36 shirakashi 1.82 1.97 1.24
37 shirakashi 1.70 1.95 1.20
38 shirakashi 1.56 1.98 1.13
39 shirakashi 1.90 2.06 1.25
40 shirakashi 1.37 1.89 1.09
41 shirakashi 2.01 1.94 1.39
42 shirakashi 2.12 1.97 1.32
43 shirakashi 1.89 2.03 1.26
44 shirakashi 1.87 2.06 1.22
45 arakashi 1.68 1.89 1.23
46 arakashi 1.42 1.87 1.12
47 arakashi 1.54 1.82 1.15
48 arakashi 1.30 1.77 1.19
49 arakashi 1.53 1.81 1.18
50 arakashi 1.47 1.85 1.13
51 arakashi 1.64 1.89 1.26
52 arakashi 1.44 1.81 1.14
53 arakashi 1.36 1.87 1.09
54 arakashi 1.56 1.90 1.17
55 arakashi 1.49 1.82 1.17
56 arakashi 1.51 1.84 1.16
57 arakashi 1.41 1.88 1.12
58 arakashi 1.48 1.83 1.17

また、Jupyter Notebook 上では、たとえば次のように .style メソッドなどをデータに適用することで、数値データをわかりやすく可視化することができます。

x.style.background_gradient()
  tree weight height diameter
0 kunugi 5.550000 2.270000 1.890000
1 kunugi 4.620000 1.980000 1.840000
2 kunugi 5.050000 2.080000 1.900000
3 kunugi 5.440000 2.180000 1.910000
4 kunugi 5.600000 2.200000 1.930000
5 kunugi 4.830000 2.190000 1.850000
6 kunugi 5.550000 2.160000 2.000000
7 kunugi 5.130000 2.200000 1.870000
8 kunugi 6.030000 2.260000 2.010000
9 kunugi 7.410000 2.350000 2.120000
10 konara 1.600000 2.110000 1.100000
11 konara 1.490000 2.040000 1.090000
12 konara 1.740000 2.300000 1.170000
13 konara 1.570000 2.110000 1.110000
14 konara 1.880000 2.330000 1.110000
15 konara 1.630000 2.120000 1.140000
16 konara 1.450000 2.060000 1.090000
17 konara 1.070000 1.910000 0.980000
18 konara 1.530000 2.170000 1.170000
19 konara 1.610000 2.000000 1.120000
20 matebashii 2.960000 2.750000 1.350000
21 matebashii 3.180000 2.800000 1.440000
22 matebashii 3.080000 2.730000 1.420000
23 matebashii 2.890000 2.780000 1.380000
24 matebashii 3.680000 2.830000 1.510000
25 matebashii 2.930000 2.620000 1.380000
26 matebashii 2.300000 2.500000 1.260000
27 matebashii 3.180000 2.680000 1.460000
28 matebashii 3.130000 2.760000 1.400000
29 matebashii 2.200000 2.540000 1.210000
30 shirakashi 1.760000 1.950000 1.230000
31 shirakashi 1.960000 2.060000 1.230000
32 shirakashi 1.770000 1.930000 1.240000
33 shirakashi 1.880000 2.070000 1.250000
34 shirakashi 1.700000 1.970000 1.200000
35 shirakashi 1.780000 2.090000 1.200000
36 shirakashi 1.820000 1.970000 1.240000
37 shirakashi 1.700000 1.950000 1.200000
38 shirakashi 1.560000 1.980000 1.130000
39 shirakashi 1.900000 2.060000 1.250000
40 shirakashi 1.370000 1.890000 1.090000
41 shirakashi 2.010000 1.940000 1.390000
42 shirakashi 2.120000 1.970000 1.320000
43 shirakashi 1.890000 2.030000 1.260000
44 shirakashi 1.870000 2.060000 1.220000
45 arakashi 1.680000 1.890000 1.230000
46 arakashi 1.420000 1.870000 1.120000
47 arakashi 1.540000 1.820000 1.150000
48 arakashi 1.300000 1.770000 1.190000
49 arakashi 1.530000 1.810000 1.180000
50 arakashi 1.470000 1.850000 1.130000
51 arakashi 1.640000 1.890000 1.260000
52 arakashi 1.440000 1.810000 1.140000
53 arakashi 1.360000 1.870000 1.090000
54 arakashi 1.560000 1.900000 1.170000
55 arakashi 1.490000 1.820000 1.170000
56 arakashi 1.510000 1.840000 1.160000
57 arakashi 1.410000 1.880000 1.120000
58 arakashi 1.480000 1.830000 1.170000
x.style.bar()
  tree weight height diameter
0 kunugi 5.550000 2.270000 1.890000
1 kunugi 4.620000 1.980000 1.840000
2 kunugi 5.050000 2.080000 1.900000
3 kunugi 5.440000 2.180000 1.910000
4 kunugi 5.600000 2.200000 1.930000
5 kunugi 4.830000 2.190000 1.850000
6 kunugi 5.550000 2.160000 2.000000
7 kunugi 5.130000 2.200000 1.870000
8 kunugi 6.030000 2.260000 2.010000
9 kunugi 7.410000 2.350000 2.120000
10 konara 1.600000 2.110000 1.100000
11 konara 1.490000 2.040000 1.090000
12 konara 1.740000 2.300000 1.170000
13 konara 1.570000 2.110000 1.110000
14 konara 1.880000 2.330000 1.110000
15 konara 1.630000 2.120000 1.140000
16 konara 1.450000 2.060000 1.090000
17 konara 1.070000 1.910000 0.980000
18 konara 1.530000 2.170000 1.170000
19 konara 1.610000 2.000000 1.120000
20 matebashii 2.960000 2.750000 1.350000
21 matebashii 3.180000 2.800000 1.440000
22 matebashii 3.080000 2.730000 1.420000
23 matebashii 2.890000 2.780000 1.380000
24 matebashii 3.680000 2.830000 1.510000
25 matebashii 2.930000 2.620000 1.380000
26 matebashii 2.300000 2.500000 1.260000
27 matebashii 3.180000 2.680000 1.460000
28 matebashii 3.130000 2.760000 1.400000
29 matebashii 2.200000 2.540000 1.210000
30 shirakashi 1.760000 1.950000 1.230000
31 shirakashi 1.960000 2.060000 1.230000
32 shirakashi 1.770000 1.930000 1.240000
33 shirakashi 1.880000 2.070000 1.250000
34 shirakashi 1.700000 1.970000 1.200000
35 shirakashi 1.780000 2.090000 1.200000
36 shirakashi 1.820000 1.970000 1.240000
37 shirakashi 1.700000 1.950000 1.200000
38 shirakashi 1.560000 1.980000 1.130000
39 shirakashi 1.900000 2.060000 1.250000
40 shirakashi 1.370000 1.890000 1.090000
41 shirakashi 2.010000 1.940000 1.390000
42 shirakashi 2.120000 1.970000 1.320000
43 shirakashi 1.890000 2.030000 1.260000
44 shirakashi 1.870000 2.060000 1.220000
45 arakashi 1.680000 1.890000 1.230000
46 arakashi 1.420000 1.870000 1.120000
47 arakashi 1.540000 1.820000 1.150000
48 arakashi 1.300000 1.770000 1.190000
49 arakashi 1.530000 1.810000 1.180000
50 arakashi 1.470000 1.850000 1.130000
51 arakashi 1.640000 1.890000 1.260000
52 arakashi 1.440000 1.810000 1.140000
53 arakashi 1.360000 1.870000 1.090000
54 arakashi 1.560000 1.900000 1.170000
55 arakashi 1.490000 1.820000 1.170000
56 arakashi 1.510000 1.840000 1.160000
57 arakashi 1.410000 1.880000 1.120000
58 arakashi 1.480000 1.830000 1.170000

読み込んだデータ全体ではなく、たとえば最初の数行や最後の数行だけを表示したい場合には、head および tail メソッドを使用します。これらのメソッドは、標準では先頭または末尾の 5 行を表示しますが、引数 n を指定することで表示する行数を変更できます。また、headtail の結果に対して、続けて style メソッドを適用することも可能です。

x.head()
tree weight height diameter
0 kunugi 5.55 2.27 1.89
1 kunugi 4.62 1.98 1.84
2 kunugi 5.05 2.08 1.90
3 kunugi 5.44 2.18 1.91
4 kunugi 5.60 2.20 1.93
x.tail(n=8).style.bar()
  tree weight height diameter
51 arakashi 1.640000 1.890000 1.260000
52 arakashi 1.440000 1.810000 1.140000
53 arakashi 1.360000 1.870000 1.090000
54 arakashi 1.560000 1.900000 1.170000
55 arakashi 1.490000 1.820000 1.170000
56 arakashi 1.510000 1.840000 1.160000
57 arakashi 1.410000 1.880000 1.120000
58 arakashi 1.480000 1.830000 1.170000

4.1.3. データの行と列#

データフレームから特定の位置にある値を取り出すには、iloc または loc を使います。iloc は、行番号と列番号で指定するときに使用します。loc は、行名(インデックス)と列名で指定するときに使用します。

たとえば、データフレーム x の 1 行 3 列目のデータを取り出すには、iloc[0, 2] のように指定します。

x.iloc[0, 2]
np.float64(2.27)

なお、iloc および loc は、オブジェクトのインデクサーindexer)と呼ばれ、添え字を使ってデータの位置やラベルを指定するための抽象的な操作手段です。インデクサーは、関数やメソッドとは異なるため、 () を使わずに [] を使って添え字を指定します。たとえば、iloc[0, 2] のように書くのが正しく、iloc(0, 2) のように書くとエラーになります。

4.1.3.1. 列の抽出#

特定の列だけを取り出す操作は、「ある列のすべての行を取り出す」ことと同じです。 たとえば、2 列目のデータをすべて取得したい場合は、iloc[:, 1] のように指定します。このとき、: は「すべての行」を意味し、1 は 2 番目の列を取り出すという指定になります。

x.iloc[:, 1]
0     5.55
1     4.62
2     5.05
3     5.44
4     5.60
5     4.83
6     5.55
7     5.13
8     6.03
9     7.41
10    1.60
11    1.49
12    1.74
13    1.57
14    1.88
15    1.63
16    1.45
17    1.07
18    1.53
19    1.61
20    2.96
21    3.18
22    3.08
23    2.89
24    3.68
25    2.93
26    2.30
27    3.18
28    3.13
29    2.20
30    1.76
31    1.96
32    1.77
33    1.88
34    1.70
35    1.78
36    1.82
37    1.70
38    1.56
39    1.90
40    1.37
41    2.01
42    2.12
43    1.89
44    1.87
45    1.68
46    1.42
47    1.54
48    1.30
49    1.53
50    1.47
51    1.64
52    1.44
53    1.36
54    1.56
55    1.49
56    1.51
57    1.41
58    1.48
Name: weight, dtype: float64

このように取り出した結果は、シリーズSeries)というデータ型になります。シリーズは 1 列のデータを表しており、数学でいう列ベクトルのようなイメージです。基本的な扱い方はリストに似ていて、インデックスを指定して特定の位置の値を取得できます。さらに、シリーズの各要素には名前を付けることができ、名前が付いたシリーズでは、インデックスの番号だけでなく名前を使って値を取得することも可能です。

データフレームから複数の列を取り出す場合は、列番号をリストで指定します。

x.iloc[:, [1, 2, 3]]
weight height diameter
0 5.55 2.27 1.89
1 4.62 1.98 1.84
2 5.05 2.08 1.90
3 5.44 2.18 1.91
4 5.60 2.20 1.93
5 4.83 2.19 1.85
6 5.55 2.16 2.00
7 5.13 2.20 1.87
8 6.03 2.26 2.01
9 7.41 2.35 2.12
10 1.60 2.11 1.10
11 1.49 2.04 1.09
12 1.74 2.30 1.17
13 1.57 2.11 1.11
14 1.88 2.33 1.11
15 1.63 2.12 1.14
16 1.45 2.06 1.09
17 1.07 1.91 0.98
18 1.53 2.17 1.17
19 1.61 2.00 1.12
20 2.96 2.75 1.35
21 3.18 2.80 1.44
22 3.08 2.73 1.42
23 2.89 2.78 1.38
24 3.68 2.83 1.51
25 2.93 2.62 1.38
26 2.30 2.50 1.26
27 3.18 2.68 1.46
28 3.13 2.76 1.40
29 2.20 2.54 1.21
30 1.76 1.95 1.23
31 1.96 2.06 1.23
32 1.77 1.93 1.24
33 1.88 2.07 1.25
34 1.70 1.97 1.20
35 1.78 2.09 1.20
36 1.82 1.97 1.24
37 1.70 1.95 1.20
38 1.56 1.98 1.13
39 1.90 2.06 1.25
40 1.37 1.89 1.09
41 2.01 1.94 1.39
42 2.12 1.97 1.32
43 1.89 2.03 1.26
44 1.87 2.06 1.22
45 1.68 1.89 1.23
46 1.42 1.87 1.12
47 1.54 1.82 1.15
48 1.30 1.77 1.19
49 1.53 1.81 1.18
50 1.47 1.85 1.13
51 1.64 1.89 1.26
52 1.44 1.81 1.14
53 1.36 1.87 1.09
54 1.56 1.90 1.17
55 1.49 1.82 1.17
56 1.51 1.84 1.16
57 1.41 1.88 1.12
58 1.48 1.83 1.17

次に、loc を使って行や列を抽出する方法を見ていきます。loc は、行名や列名を指定してデータを取り出すときに使用します。

たとえば、データフレーム x から weight 列を取り出したい場合は、次のように実行します。

x.loc[:, 'weight']
0     5.55
1     4.62
2     5.05
3     5.44
4     5.60
5     4.83
6     5.55
7     5.13
8     6.03
9     7.41
10    1.60
11    1.49
12    1.74
13    1.57
14    1.88
15    1.63
16    1.45
17    1.07
18    1.53
19    1.61
20    2.96
21    3.18
22    3.08
23    2.89
24    3.68
25    2.93
26    2.30
27    3.18
28    3.13
29    2.20
30    1.76
31    1.96
32    1.77
33    1.88
34    1.70
35    1.78
36    1.82
37    1.70
38    1.56
39    1.90
40    1.37
41    2.01
42    2.12
43    1.89
44    1.87
45    1.68
46    1.42
47    1.54
48    1.30
49    1.53
50    1.47
51    1.64
52    1.44
53    1.36
54    1.56
55    1.49
56    1.51
57    1.41
58    1.48
Name: weight, dtype: float64

複数の列を取り出す場合は、対象となる列名をリストとして与えます。

x.loc[:, ['height', 'diameter']]
height diameter
0 2.27 1.89
1 1.98 1.84
2 2.08 1.90
3 2.18 1.91
4 2.20 1.93
5 2.19 1.85
6 2.16 2.00
7 2.20 1.87
8 2.26 2.01
9 2.35 2.12
10 2.11 1.10
11 2.04 1.09
12 2.30 1.17
13 2.11 1.11
14 2.33 1.11
15 2.12 1.14
16 2.06 1.09
17 1.91 0.98
18 2.17 1.17
19 2.00 1.12
20 2.75 1.35
21 2.80 1.44
22 2.73 1.42
23 2.78 1.38
24 2.83 1.51
25 2.62 1.38
26 2.50 1.26
27 2.68 1.46
28 2.76 1.40
29 2.54 1.21
30 1.95 1.23
31 2.06 1.23
32 1.93 1.24
33 2.07 1.25
34 1.97 1.20
35 2.09 1.20
36 1.97 1.24
37 1.95 1.20
38 1.98 1.13
39 2.06 1.25
40 1.89 1.09
41 1.94 1.39
42 1.97 1.32
43 2.03 1.26
44 2.06 1.22
45 1.89 1.23
46 1.87 1.12
47 1.82 1.15
48 1.77 1.19
49 1.81 1.18
50 1.85 1.13
51 1.89 1.26
52 1.81 1.14
53 1.87 1.09
54 1.90 1.17
55 1.82 1.17
56 1.84 1.16
57 1.88 1.12
58 1.83 1.17

なお、列の抽出するときに、lociloc を使わなくても、列名を使って辞書のような記法でも取り出すことができます。たとえば、x['tree'] とするだけで、データフレーム x から tree 列を取り出すことができます。統計解析などでは列単位での処理が多く、このような簡潔な記法を使うことで、コードがより読みやすく、効率的になります。

x['tree']
0         kunugi
1         kunugi
2         kunugi
3         kunugi
4         kunugi
5         kunugi
6         kunugi
7         kunugi
8         kunugi
9         kunugi
10        konara
11        konara
12        konara
13        konara
14        konara
15        konara
16        konara
17        konara
18        konara
19        konara
20    matebashii
21    matebashii
22    matebashii
23    matebashii
24    matebashii
25    matebashii
26    matebashii
27    matebashii
28    matebashii
29    matebashii
30    shirakashi
31    shirakashi
32    shirakashi
33    shirakashi
34    shirakashi
35    shirakashi
36    shirakashi
37    shirakashi
38    shirakashi
39    shirakashi
40    shirakashi
41    shirakashi
42    shirakashi
43    shirakashi
44    shirakashi
45      arakashi
46      arakashi
47      arakashi
48      arakashi
49      arakashi
50      arakashi
51      arakashi
52      arakashi
53      arakashi
54      arakashi
55      arakashi
56      arakashi
57      arakashi
58      arakashi
Name: tree, dtype: object

4.1.3.2. 行の抽出#

データフレームから特定の行を取り出す場合も、基本的には iloc または loc を使います。列を取り出すときと同様に、行番号や行名を指定して抽出します。

x.iloc[0, :]
tree        kunugi
weight        5.55
height        2.27
diameter      1.89
Name: 0, dtype: object
x.loc[0:4, :]
tree weight height diameter
0 kunugi 5.55 2.27 1.89
1 kunugi 4.62 1.98 1.84
2 kunugi 5.05 2.08 1.90
3 kunugi 5.44 2.18 1.91
4 kunugi 5.60 2.20 1.93

条件を指定して特定の行を抽出することもできます。たとえば、「重さ(weight)」が 4.0g 以上のデータだけを取り出したい場合、まず条件に合致するかどうかを示す論理インデックスを作成し、それを使ってフィルタリングします。論理インデックスとは、各値が True または False となっているリストや、それと同等のシリーズや配列[1]のことを指します。

is_ge_4 = (x.loc[:, 'weight'] >= 4.0)
is_ge_4
0      True
1      True
2      True
3      True
4      True
5      True
6      True
7      True
8      True
9      True
10    False
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18    False
19    False
20    False
21    False
22    False
23    False
24    False
25    False
26    False
27    False
28    False
29    False
30    False
31    False
32    False
33    False
34    False
35    False
36    False
37    False
38    False
39    False
40    False
41    False
42    False
43    False
44    False
45    False
46    False
47    False
48    False
49    False
50    False
51    False
52    False
53    False
54    False
55    False
56    False
57    False
58    False
Name: weight, dtype: bool
heavy_acorns = x.loc[is_ge_4, :]
heavy_acorns
tree weight height diameter
0 kunugi 5.55 2.27 1.89
1 kunugi 4.62 1.98 1.84
2 kunugi 5.05 2.08 1.90
3 kunugi 5.44 2.18 1.91
4 kunugi 5.60 2.20 1.93
5 kunugi 4.83 2.19 1.85
6 kunugi 5.55 2.16 2.00
7 kunugi 5.13 2.20 1.87
8 kunugi 6.03 2.26 2.01
9 kunugi 7.41 2.35 2.12

論理インデックスは、数値の比較だけでなく、文字列の比較でも作成できます。例えば、アラカシ(arakashi)のデータだけを抽出したい場合は次のように実行します。

arakashi = x.loc[x.loc[:, 'tree'] == 'arakashi', :]
arakashi
tree weight height diameter
45 arakashi 1.68 1.89 1.23
46 arakashi 1.42 1.87 1.12
47 arakashi 1.54 1.82 1.15
48 arakashi 1.30 1.77 1.19
49 arakashi 1.53 1.81 1.18
50 arakashi 1.47 1.85 1.13
51 arakashi 1.64 1.89 1.26
52 arakashi 1.44 1.81 1.14
53 arakashi 1.36 1.87 1.09
54 arakashi 1.56 1.90 1.17
55 arakashi 1.49 1.82 1.17
56 arakashi 1.51 1.84 1.16
57 arakashi 1.41 1.88 1.12
58 arakashi 1.48 1.83 1.17

次のように簡潔に記述することもできます。

arakashi = x.loc[x['tree'] == 'arakashi', :]
arakashi
tree weight height diameter
45 arakashi 1.68 1.89 1.23
46 arakashi 1.42 1.87 1.12
47 arakashi 1.54 1.82 1.15
48 arakashi 1.30 1.77 1.19
49 arakashi 1.53 1.81 1.18
50 arakashi 1.47 1.85 1.13
51 arakashi 1.64 1.89 1.26
52 arakashi 1.44 1.81 1.14
53 arakashi 1.36 1.87 1.09
54 arakashi 1.56 1.90 1.17
55 arakashi 1.49 1.82 1.17
56 arakashi 1.51 1.84 1.16
57 arakashi 1.41 1.88 1.12
58 arakashi 1.48 1.83 1.17

4.1.4. データの集計#

データフレームの各列について、欠損値を除いた後の平均値、分散、サンプル数(件数)などの概要統計量を確認するには、describe メソッドを利用します。このメソッドを使用すると、数値型の列すべてに対して、基本的な統計情報が自動的に計算されます。

x.describe()
weight height diameter
count 59.000000 59.000000 59.000000
mean 2.512373 2.131864 1.337966
std 1.508329 0.296505 0.291889
min 1.070000 1.770000 0.980000
25% 1.535000 1.905000 1.145000
50% 1.780000 2.060000 1.230000
75% 3.020000 2.230000 1.395000
max 7.410000 2.830000 2.120000

また、特定の列だけに対して概要統計量を計算したい場合は、まずその列を取り出し、その後で describe メソッドを適用します。

x.loc[:, 'weight'].describe()
count    59.000000
mean      2.512373
std       1.508329
min       1.070000
25%       1.535000
50%       1.780000
75%       3.020000
max       7.410000
Name: weight, dtype: float64

概要統計量だけでなく、基本的な統計量を個別に計算することもできます。例えば、平均や分散は次のように計算できます。いくつかの例を次に示します。

x.loc[:, 'weight'].mean()
np.float64(2.5123728813559314)
x.loc[x['tree'] == 'kunugi', 'weight'].mean()
np.float64(5.520999999999999)
x.loc[x['tree'] == 'kunugi', ['weight', 'height']].var()
weight    0.611766
height    0.010468
dtype: float64

このように、データフレームやシリーズの後ろに関数名を付けて実行すると、それぞれの列や要素に対してその関数が適用されます。ここで使われている meanvar は、データフレームやシリーズ専用に定義された関数で、これをメソッドと呼びます。メソッドは、特定のデータ型に対してのみ使える関数であり、他の型には使えません。たとえば、リストに対して mean を実行しようとすると、次のようなエラーが表示されます。

y = [1, 2, 3]
y.mean()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[29], line 2
      1 y = [1, 2, 3]
----> 2 y.mean()

AttributeError: 'list' object has no attribute 'mean'

AttributeError が表示された場合は、そのメソッドが使えるデータ型になっているかどうかを確認してみてください。データフレームのつもりで使っていたのに、実はリストだったという思い込みが原因なことがよくあります。Python は察してくれません。ないものはないと言います。しかも、けっこう冷たく。

次に、データに含まれる木の種類の数を調べてみましょう。データフレーム xtree 列には、どんぐりを採取した木の種類が記録されています。このデータに何種類の木が含まれているのかを調べるには、unique メソッドを使います。

x['tree'].unique()
array(['kunugi', 'konara', 'matebashii', 'shirakashi', 'arakashi'],
      dtype=object)

このメソッドを使うと、tree 列に登場するユニークな値(重複のない値)が配列として表示されます。また、unique の代わりに value_counts メソッドを使うと、ユニークな値とその出現頻度を簡単に確認できます。結果はシリーズ型で返され、木の種類ごとのデータ数がわかります。

x['tree'].value_counts()
tree
shirakashi    15
arakashi      14
kunugi        10
konara        10
matebashii    10
Name: count, dtype: int64

Pandas には、簡単なグラフを描くためのメソッドも用意されています。たとえば、データフレームに対して hist メソッドを使うと、すべての列に対してヒストグラムが一度に描かれます。データがどのような分布になっているかを手軽に確認できます。なお、hist メソッドは内部で Matplotlib ライブラリを使っています。そのため、事前に Matplotlib をインポートしておく必要があります。

import matplotlib
x.hist()
array([[<Axes: title={'center': 'weight'}>,
        <Axes: title={'center': 'height'}>],
       [<Axes: title={'center': 'diameter'}>, <Axes: >]], dtype=object)
../_images/67f22805b91bd91d17a6617d24e07debd87d8a191d3615eac97574b21946347f.png

Pandas の可視化機能は、データの大まかな傾向や分布を素早く把握するのに便利です。しかし、細かい調整にはあまり向いていません。より柔軟で美しいグラフを作成したい場合は、MatplotlibSeaborn といった外部ライブラリを利用するのがおすすめです。

練習問題 PD-1

acorns.csv データを読み込み、クヌギ(kunugi)のどんぐりについて、重さ(weight)、高さ(height)、直径(diameter)の平均値をそれぞれ求めなさい。

練習問題 PD-2

acorns.csv データを読み込み、平均重量が最も重いどんぐりの種類を調べなさい。

練習問題 PD-3

acorns.csv データを読み込み、アラカシ(arakashi)の採種地点(location)を調べ、それぞれの地点ごとに平均重量を求めなさい。

練習問題 PD-4

acorns.csv データを読み込み、クヌギ(kunugi)のどんぐりの重さ(weight)が 4.0g 以上のデータだけを抽出し、その件数を求めなさい。

合ってそうに見える出力がいちばん怖い。特に締切前は。