ilocとlocの違い

5591 ワード

ilocとlocの違いは、いつもあいまいで、テストで比較してみましょう.
import pandas as pd
import os
import numpy as np

フォルダの設定
os.chdir("/Users/XXX/Documents/csv“)

ファイルを開き、値を割り当て、インデックスを追加
In [8]:df = pd.read_csv("ex6.csv”)
In [9]: df1 = df.head(10)                                                       
In [10]: df1                                                                    
Out[10]: 
        one       two     three      four key
0  0.467976 -0.038649 -0.295344 -1.824726   L
1 -0.358893  1.404453  0.704965 -0.200638   B
2 -0.501840  0.659254 -0.421691 -0.057688   G
3  0.204886  1.074134  1.388361 -0.982404   R
4  0.354628 -0.133116  0.283763 -0.837063   Q
5  1.817480  0.742273  0.419395 -2.251035   Q
6 -0.776764  0.935518 -0.332872 -1.875641   U
7 -0.913135  1.530624 -0.572657  0.477252   K
8  0.358480 -0.497572 -0.367016  0.507702   S
9 -1.740877 -1.160417 -1.637830  2.172201   G
In [11]: df1.index = ['A','B','C','D','E','F','G','H','I','K’] 

ilocは、ゼロ行目のデータを取得する位置インデックスに従って行データを取得する
In [14]: df1.iloc[0]                                                            
Out[14]: 
one       0.467976
two     -0.0386485
three    -0.295344
four      -1.82473
key              L
Name: A, dtype: object 

ilocは位置インデックスに従って1行目から4行目のデータを取得し、これは前閉後開である
In [15]: df1.iloc[1:5]                                                          
Out[15]: 
        one       two     three      four key
B -0.358893  1.404453  0.704965 -0.200638   B
C -0.501840  0.659254 -0.421691 -0.057688   G
D  0.204886  1.074134  1.388361 -0.982404   R
E  0.354628 -0.133116  0.283763 -0.837063   Q   

以下の式【16】、【17】において、ilocとlocの意味は同じで、取ったある数行、ある数列のデータを表す
In [16]: df1.iloc[[1,2],[2,3]]                                                  
Out[16]: 
      three      four
B  0.704965 -0.200638
C -0.421691 -0.057688
In [17]: df1.iloc[:,[2,3]]                                                      
Out[17]: 
      three      four
A -0.295344 -1.824726
B  0.704965 -0.200638
C -0.421691 -0.057688
D  1.388361 -0.982404
E  0.283763 -0.837063
F  0.419395 -2.251035
G -0.332872 -1.875641
H -0.572657  0.477252
I -0.367016  0.507702
K -1.637830  2.172201

locはタグインデックスによる行または列データであり、これはインデックスが「A」である行であり、この場合もゼロ行目を取得することに相当する.
In [18]: df1.loc['A']                                                           
Out[18]: 
one       0.467976
two     -0.0386485
three    -0.295344
four      -1.82473
key              L
Name: A, dtype: object

これは、行ラベルに従って、「A」と「C」のラベルを付けた行です.
In [19]: df1.loc[['A','C’]]
Out[19]: 
        one       two     three      four key
A  0.467976 -0.038649 -0.295344 -1.824726   L
C -0.501840  0.659254 -0.421691 -0.057688   G

In [20]: df1.loc[['A','C'],['one','three']]                            
Out[20]: 
        one     three
A  0.467976 -0.295344
C -0.501840 -0.421691

【17】の意味と一致する
In [21]: df1.loc[:,['one','three']]                                             
Out[21]: 
        one     three
A  0.467976 -0.295344
B -0.358893  0.704965
C -0.501840 -0.421691
D  0.204886  1.388361
E  0.354628  0.283763
F  1.817480  0.419395
G -0.776764 -0.332872
H -0.913135 -0.572657
I  0.358480 -0.367016
K -1.740877 -1.637830

次のテストでローインデックスが設定されていない場合
In [44]: df2 = df.head(10)                                                      
In [45]: df2                                                                    
Out[45]: 
        one       two     three      four key
0  0.467976 -0.038649 -0.295344 -1.824726   L
1 -0.358893  1.404453  0.704965 -0.200638   B
2 -0.501840  0.659254 -0.421691 -0.057688   G
3  0.204886  1.074134  1.388361 -0.982404   R
4  0.354628 -0.133116  0.283763 -0.837063   Q
5  1.817480  0.742273  0.419395 -2.251035   Q
6 -0.776764  0.935518 -0.332872 -1.875641   U
7 -0.913135  1.530624 -0.572657  0.477252   K
8  0.358480 -0.497572 -0.367016  0.507702   S
9 -1.740877 -1.160417 -1.637830  2.172201   G

このときilocには大きな変化はありません.位置によって取得されるので、ゼロから始まります.
In [46]: df2.iloc[1]                                                            
Out[46]: 
one     -0.358893
two       1.40445
three    0.704965
four    -0.200638
key             B
Name: 1, dtype: object

#iloc前閉後開
In [47]: df2.iloc[1:3]                                                          
Out[47]: 
        one       two     three      four key
1 -0.358893  1.404453  0.704965 -0.200638   B
2 -0.501840  0.659254 -0.421691 -0.057688   G

locはラベルに従っているので、前閉後閉に相当します
In [48]: df2.loc[1:3]                                                           
Out[48]: 
        one       two     three      four key
1 -0.358893  1.404453  0.704965 -0.200638   B
2 -0.501840  0.659254 -0.421691 -0.057688   G
3  0.204886  1.074134  1.388361 -0.982404   R

この取得は上と一致する
In [49]: df2.loc[1:3,['one','three']]                                           
Out[49]: 
        one     three
1 -0.358893  0.704965
2 -0.501840 -0.421691
3  0.204886  1.388361
In [50]: df2.iloc[1:2:,1:2]                                                     
Out[50]: 
        two
1  1.404453

まとめ:ilocは、位置インデックスのみで行または列を取得できます.locは、ラベルインデックスで取得した行または列のみを使用できます.