Python入門トップページ


目次

  1. Pandas とは
  2. Pandas を利用するための準備
  3. CSV ファイルを読み込む
  4. DataFrame を表示する
  5. 列や行を抽出する
    1. 列を抽出する
    2. 行を抽出する
  6. 列名を抽出する
  7. Python リストに変換する
  8. Python リストから DataFrame に変換する
  9. DataFrame から NumPy 配列に変換する
  10. 基本統計量を出力する
  11. CSV ファイルに書き出す
  12. グループ化とピボットテーブル
  13. データフレームの結合(系列名が等しいとき)
  14. データフレームの結合(系列名が異なるとき)
  15. データフレームの連結

Pandas

列や行を抽出する

列を抽出する

DataFrame について特定の列(カラム)を抽出する様々な方法を確認してみよう.主な抽出方法は df['カラム名']df[['カラム名1', 'カラム名2']]df.loc[:, 'カラム名']df.loc[:, ['カラム名1', 'カラム名2']]df.iloc[:, インデックス]df.iloc[:, インデックス1:インデックス2] です.まずは,準備として GitHub のリポジトリにあるサンプルデータ (clustering-sample.csv) を読み込みます.

CSV ファイルを読み込む
import pandas as pd
url = "https://github.com/rinsaka/sample-data-sets/blob/master/clustering-sample.csv?raw=true"
df = pd.read_csv(url)

目次に戻る

df['カラム名'] による抽出

次に読み込んだ DataFrame から特定の列を抽出する方法を確認しよう.まず,カラム名(列名)を指定して抽出するには,df['カラム名'] のように記述します.

IDカラムを抽出する
df['ID']
0        0
1        1
2        2
3        3
4        4
      ...
295    295
296    296
297    297
298    298
299    299
Name: ID, Length: 300, dtype: int64
xカラムを抽出する
df['x']
0      7.4346
1      6.5419
2      8.9819
3      3.8554
4      1.9527
        ...
295    4.1205
296    9.2843
297    6.6627
298    5.7654
299    2.2411
Name: x, Length: 300, dtype: float64
yカラムを抽出する
df['y']
0      6.6520
1      6.3611
2      9.2461
3      4.8386
4      3.4848
        ...
295    1.5010
296    1.7563
297    7.3856
298    6.0543
299    1.0902
Name: y, Length: 300, dtype: float64

目次に戻る

df[['カラム名1', 'カラム名2']] による抽出

なお,リスト形式でカラムを指定すると,複数のカラムを抽出することが可能です.

x, yカラムを抽出する
df[['x', 'y']]
pandas-04

目次に戻る

df.loc[:, 'カラム名'] による抽出

カラム名を指定して抽出する別の方法として,df.loc[:,'カラム名'] もあります.

xカラムを抽出する
df.loc[:,'x']
0      7.4346
1      6.5419
2      8.9819
3      3.8554
4      1.9527
        ...
295    4.1205
296    9.2843
297    6.6627
298    5.7654
299    2.2411
Name: x, Length: 300, dtype: float64
yカラムを抽出する
df.loc[:,'y']
0      6.6520
1      6.3611
2      9.2461
3      4.8386
4      3.4848
        ...
295    1.5010
296    1.7563
297    7.3856
298    6.0543
299    1.0902
Name: y, Length: 300, dtype: float64

目次に戻る

df.loc[:, ['カラム名1', 'カラム名2']] による抽出

複数のカラムを抽出することも可能です.

IDとyカラムを抽出する
df.loc[:, ['ID','y']]
pandas-05

目次に戻る

df.iloc[:, インデックス] による抽出

loc ではカラム名を指定して列を抽出しましたが,iloc ではカラムのインデックス(番号)で列を抽出できます.

インデックス1のカラムを抽出する
df.iloc[:,1]
0      7.4346
1      6.5419
2      8.9819
3      3.8554
4      1.9527
        ...
295    4.1205
296    9.2843
297    6.6627
298    5.7654
299    2.2411
Name: x, Length: 300, dtype: float64
インデックス2のカラムを抽出する
df.iloc[:,2]
0      6.6520
1      6.3611
2      9.2461
3      4.8386
4      3.4848
        ...
295    1.5010
296    1.7563
297    7.3856
298    6.0543
299    1.0902
Name: y, Length: 300, dtype: float64

目次に戻る

df.iloc[:, インデックス1:インデックス2] による抽出

インデックスの範囲を指定して複数のカラムを抽出することも可能です.

インデックスの範囲を指定して複数のカラムを抽出する
df.iloc[:, 1:3]
pandas-06

目次に戻る

df.drop() による列の削除

不要なカラムを df.drop() によって削除することで結果的に残りのカラムを抽出することもできます.

IDカラムを削除する
df.drop("ID", axis=1)
pandas-06

目次に戻る

行を抽出する

続いて,DataFrame について特定の行(ロウ)を抽出する様々な方法を確認してみよう.まずは,準備として GitHub のリポジトリにあるサンプルデータ (clustering-sample.csv) を読み込みます.

CSV ファイルを読み込む
import pandas as pd
url = "https://github.com/rinsaka/sample-data-sets/blob/master/clustering-sample.csv?raw=true"
df = pd.read_csv(url)

目次に戻る

カラムの条件による抽出

例えば,「x」列や「y」列の値に条件をつけて抽出してみよう.

「x」列が0.5より大きい行を抽出
print(df[df.x > 9.5])
      ID       x       y
83    83  9.6534  1.4881
123  123  9.7382  1.6249
174  174  9.8278  2.2734
231  231  9.6033  3.7000
241  241  9.6002  3.4346
243  243  9.5936  3.6232
「y」列の値が0.5より小さい行を抽出
print(df[df.y < 0.5])
      ID       x       y
13    13  8.6308  0.0555
43    43  7.7957  0.4588
55    55  7.8017  0.4752
89    89  6.2756  0.2880
101  101  9.2154  0.4284
124  124  8.0729  0.1391
129  129  9.2342  0.1341
166  166  8.7953  0.4901
195  195  6.7256  0.1430
290  290  7.5041  0.0457
292  292  8.7020  0.4945

列どうしを比較することも可能です.例えば「y」列よりも「x」列が大きい行を抽出してみます.

「y」列よりも「x」列が大きい行
print(df[df.x > df.y])
      ID       x       y
0      0  7.4346  6.6520
1      1  6.5419  6.3611
5      5  4.7211  2.7247
7      7  4.1745  1.9040
8      8  3.2748  3.0171
..   ...     ...     ...
290  290  7.5041  0.0457
292  292  8.7020  0.4945
295  295  4.1205  1.5010
296  296  9.2843  1.7563
299  299  2.2411  1.0902

[179 rows x 3 columns]

条件を満足する行が存在しない場合は次のような結果になります.

条件を満足する行が存在しない
print(df[df.x == df.y])
Empty DataFrame
Columns: [ID, x, y]
Index: []

目次に戻る

カラムの複数条件による抽出

複数条件による抽出は条件一つひとつをカッコで囲って (条件1) & (条件2)(条件1) | (条件2) と記述することで実現できます.

「x」「y」ともに 8 より大
print(df[(df.x > 8.0) & (df.y > 8.0)])
      ID       x       y
2      2  8.9819  9.2461
12    12  8.0289  9.1058
29    29  8.0111  8.9655
111  111  8.1949  9.8951
118  118  8.3428  8.4429
119  119  8.7768  8.2339
128  128  8.4849  8.1766
181  181  8.2306  8.3902
199  199  8.5239  9.4687
213  213  8.1638  9.1441
230  230  8.3358  9.7099

「x」または「y」が 8 より大
print(df[(df.x >8.0) | (df.y > 8.0)])
      ID       x       y
2      2  8.9819  9.2461
10    10  8.5039  3.8828
11    11  6.1266  9.2484
12    12  8.0289  9.1058
13    13  8.6308  0.0555
..   ...     ...     ...
279  279  8.2769  6.9348
281  281  7.7891  9.5541
292  292  8.7020  0.4945
294  294  6.7149  9.8268
296  296  9.2843  1.7563

[118 rows x 3 columns]

目次に戻る

インデックスの再設定

読み込んだ CSV ファイルには「ID」「x」「y」のカラムが存在したが,左端に表示される列は「インデックス」と呼ばれ,読み込み時に自動的に0からの連番が付くことに注意します.よって,次のように条件をつけて行を抽出した際にはどの行が抽出されたかが確認できます.

「x」が 9.5 より大
table = df[df.x > 9.5]
print(table)
      ID       x       y
83    83  9.6534  1.4881
123  123  9.7382  1.6249
174  174  9.8278  2.2734
231  231  9.6033  3.7000
241  241  9.6002  3.4346
243  243  9.5936  3.6232

場合によっては上のインデックスを0から振り直したいようなこともあります.このときは reset_index() を用いればよいが,オプショナル引数を与えなければ新たなインデックス列が追加されます.

インデックスの追加
table = df[df.x > 9.5]
table = table.reset_index()
print(table)
   index   ID       x       y
0     83   83  9.6534  1.4881
1    123  123  9.7382  1.6249
2    174  174  9.8278  2.2734
3    231  231  9.6033  3.7000
4    241  241  9.6002  3.4346
5    243  243  9.5936  3.6232

元のインデックスを削除してから振り直したい場合は drop=True オプションを指定すると良いでしょう.

インデックスの再設定
table = df[df.x > 9.5]
table = table.reset_index(drop=True)
print(table)
    ID       x       y
0   83  9.6534  1.4881
1  123  9.7382  1.6249
2  174  9.8278  2.2734
3  231  9.6033  3.7000
4  241  9.6002  3.4346
5  243  9.5936  3.6232

目次に戻る

インデックスの条件による抽出

上で振り直したインデックスの条件によって行を抽出することも可能です.例えば,インデックスが偶数の行だけを抽出してみます.

インデックスの条件による行の抽出
table = df[df.x > 9.5]
table = table.reset_index(drop=True)
print(table[table.index % 2 == 0])
    ID       x       y
0   83  9.6534  1.4881
2  174  9.8278  2.2734
4  241  9.6002  3.4346

目次に戻る