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)
次に読み込んだ 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
なお,リスト形式でカラムを指定すると,複数のカラムを抽出することが可能です.
x, yカラムを抽出する
df[['x', 'y']]
カラム名を指定して抽出する別の方法として,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
複数のカラムを抽出することも可能です.
IDとyカラムを抽出する
df.loc[:, ['ID','y']]
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:3]
不要なカラムを df.drop()
によって削除することで結果的に残りのカラムを抽出することもできます.
IDカラムを削除する
df.drop("ID", axis=1)
続いて,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