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,)

列名を指定して抽出

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」のように指定
  • データフレームのサイズは(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は含まれることに注意)
    • df.ilocの場合
      • インデックス番号2の行を抽出
        (※3は含まないことに注意)


Posted by futa