DataFrame のデータを参照する方法はいくつかありますが、その中にloc、iloc、ix という微妙によく似た属性があります。
この 3 つは、行、列 を指定してデータを参照するという、基本的に同じ目的で使われます。

異なる点は 行、列の指定の方法で、次のような違いがあります。
loc
iloc
ix
行、列の指定方法
行ラベル、 列ラベル
行の番号(0 ~ )、列の番号(0 ~ )
行ラベル、列ラベル または 行の番号(0 ~ )、列の番号(0 ~ )
この違いを、サンプルを交えて順番に見ていきます。
- 目次 -
スポンサーリンク
loc
loc は 行、列をラベルで指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
from pandas import DataFrame df=DataFrame([[1,2,3], [10,20,30], [100,200,300], [1000,2000,3000]], index=['row_0', 'row_1','row_2','row_3'], columns=['col_0','col_1','col_2']) #----------------------------- # col_0 col_1 col_2 # row_0 1 2 3 # row_1 10 20 30 # row_2 100 200 300 # row_3 1000 2000 3000 #----------------------------- # # 行ラベルを指定 # df.loc[['row_2','row_3']] #---------------------------- # col_0 col_1 col_2 # row_2 100 200 300 # row_3 1000 2000 3000 #---------------------------- # # 列ラベルを指定 # df.loc[:, ['col_1','col_2']] #--------------------------- # col_1 col_2 # row_0 2 3 # row_1 20 30 # row_2 200 300 # row_3 2000 3000 #--------------------------- # # 行と列ラベルを指定 # df.loc[['row_2','row_3'], ['col_1','col_2']] #--------------------------- # col_1 col_2 # row_2 200 300 # row_3 2000 3000 #--------------------------- # # boolean で指定 # df.loc[[False,False,True,True],[False,True,True]] #--------------------------- # col_1 col_2 # row_2 200 300 # row_3 2000 3000 #--------------------------- |
iloc
iloc は 行、列を番号で指定します(先頭が 0)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# # 行番号を指定 # df.iloc[[2,3]] #---------------------------- # col_0 col_1 col_2 # row_2 100 200 300 # row_3 1000 2000 3000 #---------------------------- # # 列番号を指定 # df.iloc[:, [1,2]] #---------------------------- # col_1 col_2 # row_0 2 3 # row_1 20 30 # row_2 200 300 # row_3 2000 3000 #---------------------------- # # 行、列番号を指定 # df.iloc[[2,3], [1,2]] #---------------------------- # col_1 col_2 # row_2 200 300 # row_3 2000 3000 #---------------------------- # # 行、列番号をスライスで指定 # df.iloc[2:4,1:3] #---------------------------- # col_1 col_2 # row_2 200 300 # row_3 2000 3000 #---------------------------- # # boolean で指定 # df.iloc[[False,False,True,True],[False,True,True]] #---------------------------- # col_1 col_2 # row_2 200 300 # row_3 2000 3000 #---------------------------- |
ix
ix は 行、列をラベル または番号で指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# # 行を指定(ラベル または 番号) # df.ix[['row_2','row_3']] (または df.ix[[2,3]]) #---------------------------- # col_0 col_1 col_2 # row_2 100 200 300 # row_3 1000 2000 3000 #---------------------------- # # 列を指定(ラベル または 番号) # df.ix[:,['col_1','col_2']] (または df.ix[:,[1,2]]) #---------------------------- # col_1 col_2 # row_0 2 3 # row_1 20 30 # row_2 200 300 # row_3 2000 3000 #---------------------------- # # 行、列を指定(ラベル または 番号) # df.ix[['row_2','row_3'],['col_1','col_2']] (または df.ix[[2,3],[1,2]]) #---------------------------- # col_1 col_2 # row_2 200 300 # row_3 2000 3000 #---------------------------- # # 行、列をスライスで指定 # df.ix[2:4,1:3] #---------------------------- # col_1 col_2 # row_2 200 300 # row_3 2000 3000 #---------------------------- # # boolean で指定 # df.ix[[False,False,True,True],[False,True,True]] #---------------------------- # col_1 col_2 # row_2 200 300 # row_3 2000 3000 #---------------------------- |
ix の注意点
ix はラベルでも番号でも指定できることを上で見ました。この点は便利といえば便利ですが、ちょっと注意が必要です。インデックスやカラムが整数型 だった場合、
1 |
df.ix[[0,1]] |
この場合、0,1 はインデックスを指すのでしょうか、それとも行の番号を指すのでしょうか。
答はインデックスです。ここを意識して使わないと、おかしな場所を参照してしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
df2=DataFrame([[1,2,3], [10,20,30], [100,200,300], [1000,2000,3000]], index=[3, 2, 1, 0], columns=['col_0','col_1','col_2']) #---------------------------- # col_0 col_1 col_2 # 3 1 2 3 # 2 10 20 30 # 1 100 200 300 # 0 1000 2000 3000 #---------------------------- # # 指定した数字はラベルとして扱われる # df2.ix[[0,1]] #---------------------------- # col_0 col_1 col_2 # 0 1000 2000 3000 # 1 100 200 300 #---------------------------- |
hirai says:
わかりやすい説明ありがとうございます。
一番最初に「微妙によく似たプロラティがあります。」とありますが、「プロラティ」っていう言葉はどのような意味なのでしょうか。調べたのですが、よくわからず、よろしくお願い致します。
管理人 says:
hiraiさん、こんにちわ。
すいません、誤植でした。プロパティの誤りです。
念のため pandas のドキュメントを見たところ loc、iloc、ix は Attributes となっており、Attributes は属性とするほうがしっくりくるので属性に直しました。