pandas:【loc,iloc】高度な行と列の指定方法
前提
- データフレームの作成
- 参考
- シンプルな行と列の指定方法
- ブールインデックス参照
列データの抽出
df.loc
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(10,20,(3,5)), columns=['a','b','c','d','e'])
print(df)
print(df.shape)
a b c d e 0 18 18 13 17 17 1 10 14 12 15 12 2 12 12 11 10 18 (3, 5)
- データフレームのサイズは(3,5)
- 10~19までのランダム数値
特定の列を抽出
x = df.loc[:,'a']
print(x)
print(x.shape)
0 18 1 10 2 12 Name: a, dtype: int64 (3,)
- 行の指定は「:」で全行とした
- 「a」列だけを抽出
- 1次元なので、Seriesになる
- Seriesについては下記にて説明
列名を指定して抽出
y = df.loc[:,['b','d']]
print(y)
print(y.shape)
b d 0 18 17 1 14 15 2 12 10 (3, 2)
- 行の指定は「:」で全行とした
- ['b’,’d’]
- 「b」「d」列を抽出
- リスト形式で指定する
- データフレームのサイズは(3,2)になった
範囲指定して抽出
z = df.loc[:,'c':'e']
print(z)
print(z.shape)
c d e 0 13 17 17 1 12 15 12 2 11 10 18 (3, 3)
- 行の指定は「:」で全行とした
- 'c’:’e’
- 「c」列~「e」列までを抽出(※「e」列は含まれる)
- 以降なら「’c’:」
- より前なら「:’c’」
- データフレームのサイズは(3,3)になった
df.iloc
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(15).reshape(3,5), columns=['a','b','c','d','e'])
print(df)
print(df.shape)
a b c d e 0 0 1 2 3 4 1 5 6 7 8 9 2 10 11 12 13 14 (3, 5)
- データフレームのサイズは(3,5)
- 0~14までの15個の順列をnp.reshapeで形状変換
特定の列を抽出
x = df.iloc[:,0]
print(x)
print(x.shape)
0 0 1 5 2 10 Name: a, dtype: int64 (3,)
- 行の指定は「:」で全行とした
- インデックス番号0で抽出
- 「a」列だけを抽出
- 「Name: a」で列名が表示されている
- 1次元なので、Seriesになる
- Seriesについては下記にて説明
列番号を指定して抽出
y = df.iloc[:,[1,3]]
print(y)
print(y.shape)
b d 0 1 3 1 6 8 2 11 13 (3, 2)
- 行の指定は「:」で全行とした
- [1,3]
- インデックス番号が1と3の「b」「d」列を抽出
- リスト形式で指定する
- データフレームのサイズは(3,2)になった
範囲を指定して抽出
z = df.iloc[:,1:4]
print(z)
print(z.shape)
b c d 0 1 2 3 1 6 7 8 2 11 12 13 (3, 3)
- 行の指定は「:」で全行とした
- 1:4
- インデックス番号が1~3までの「b」列~「d」列までを抽出
(※インデックス番号が4の「e」列は含まれない) - 以降なら「3:」のように指定
- より前なら「:3」のように指定
- インデックス番号が1~3までの「b」列~「d」列までを抽出
- データフレームのサイズは(3,3)になった
行データの抽出
- df.loc、df.ilocともにほぼ同様のため、df.locで説明
- 異なる点は後述
df.loc(df.ilocも共通)
データ作成
import numpy as np
import pandas as pd
arr = [11,22,33,44,55]
df = pd.DataFrame({'a':arr,'b':arr,'c':arr,'d':arr})
print(df)
print(df.shape)
a b c d 0 11 11 11 11 1 22 22 22 22 2 33 33 33 33 3 44 44 44 44 4 55 55 55 55 (5, 4)
- データフレームのサイズは(5,4)
- 配列を縦にして横につなげて作成
1行取り出し
a = df.loc[0]
b = df.loc[[0]]
print(a)
print(a.shape)
print(b)
print(b.shape)
a 11
b 11
c 11
d 11
Name: 0, dtype: int64
(4,)
a b c d
0 11 11 11 11
(1, 4)
- 対象行を数値で指定(1つ目のa)
- インデックス番号0の1行目が抽出された
- 取得結果は(4,)のSeriesになる
- 対象行をリストで指定(2つ目のb)
- インデックス番号0の1行目が抽出された
- 取得結果は(1,4)のDataFrameになる
- 引数が0と[0]では結果のデータタイプが異なることに注意
複数行取り出し(行番号指定)
c = df.loc[[1,2]]
print(c)
print(c.shape)
a b c d 1 22 22 22 22 2 33 33 33 33 (2, 4)
- [1,2]
- リストで指定
- 対象行のインデックス番号を数値で指定(0から始まる)
- 行のインデックス番号(≒行番号)1と2の2行が抽出された
複数行取り出し(範囲指定)
d = df.loc[2:3]
e = df.iloc[2:3]
print(d)
print(d.shape)
print(e)
print(e.shape)
a b c d
2 33 33 33 33
3 44 44 44 44
(2, 4)
a b c d
2 33 33 33 33
(1, 4)
- df.locとdf.ilocの場合で結果が異なる
- 2:3
- df.locの場合
- 2~3のインデックス番号の行を抽出
(※3は含まれることに注意)
- 2~3のインデックス番号の行を抽出
- df.ilocの場合
- インデックス番号2の行を抽出
(※3は含まないことに注意)
- インデックス番号2の行を抽出
- df.locの場合
