1. ホーム
  2. パイソン

[解決済み】ilocとlocはどう違うのですか?

2022-03-23 08:33:29

質問

この2つのスライス方法はどう違うのか、どなたか説明してください。

私が見たのは ドキュメント , を見たことがあります。 これら 回答 しかし、この3つがどのように違うのか、まだ理解できていません。私にとっては、この3つは互換性があるように見えますが、それはこの3つがスライシングの低いレベルにあるからです。

たとえば DataFrame . この2つの動作はどうなっているのでしょうか?

df.loc[:5]
df.iloc[:5]

どなたか、用途の区別が明確なケースを3つほど提示していただけませんか?


昔々、私もこの2つの機能と df.ix[:5] しかし ix はpandas 1.0から削除されたので、もうどうでもいい。

解決方法は?

ラベル vs. 所在地

この2つの方法の主な違いは。

  • loc を持つ行(または列)を取得します。 ラベル .

  • iloc 行(または列)を整数で取得します。 場所 .

デモンストレーションのために、次のようなシリーズを考えてみましょう。 s の文字が、単調でない整数のインデックスを持つ。

>>> s = pd.Series(list("abcdef"), index=[49, 48, 47, 0, 1, 2]) 
49    a
48    b
47    c
0     d
1     e
2     f

>>> s.loc[0]    # value at index label 0
'd'

>>> s.iloc[0]   # value at index location 0
'a'

>>> s.loc[0:1]  # rows at index labels between 0 and 1 (inclusive)
0    d
1    e

>>> s.iloc[0:1] # rows at index location between 0 and 1 (exclusive)
49    a

以下は、「Select」「Select」「Select」の違い/類似点です。 s.locs.iloc を使用すると、さまざまなオブジェクトを渡すことができます。

<テーブル <object> 説明 s.loc[<object>] s.iloc[<object>] 0 単品 インデックスにおける値 ラベル 0 (文字列 'd' ) インデックスにおける値 位置 0(文字列 'a' ) 0:1 スライス 2つ 行(ラベル 01 ) 一人 行 (位置 0 の最初の行) 1:47 境界外端のスライス ゼロ 行 (空のシリーズ) 5件 行 (ロケーション 1 以降) 1:47:-1 負のステップを持つスライス 行(ラベル 1 に戻る 47 ) ゼロ 行 (空のシリーズ) [2, 0] 整数値リスト 2つ 与えられたラベルを持つ行 2つ 指定された位置の行 s > 'e' ブール系列(どの値がそのプロパティを持つかを示す) 一人 行を含む 'f' ) NotImplementedError (s>'e').values ブール配列 一人 行を含む 'f' ) と同じです。 loc 999 int オブジェクトがインデックスにない KeyError IndexError (圏外) -1 int オブジェクトがインデックスにない KeyError の最後の値を返します。 s lambda x: x.index[3] シリーズに適用される callable (ここでは 3 を返している) rd の項目) s.loc[s.index[3]] s.iloc[s.index[3]]

loc のラベルクエリ機能は、整数インデックスをはるかに超えて拡張されており、いくつかの追加例を強調する価値があります。

インデックスに文字列オブジェクトが含まれるシリーズを紹介します。

>>> s2 = pd.Series(s.index, index=s.values)
>>> s2
a    49
b    48
c    47
d     0
e     1
f     2

以降 loc はラベルベースなので、Series の最初の値を s2.loc['a'] . また、非整数のオブジェクトでスライスすることも可能です。

>>> s2.loc['c':'e']  # all rows lying between 'c' and 'e' (inclusive)
c    47
d     0
e     1

DateTimeインデックスの場合、ラベルで取得するために正確な日時を渡す必要はありません。例えば

>>> s3 = pd.Series(list('abcde'), pd.date_range('now', periods=5, freq='M')) 
>>> s3
2021-01-31 16:41:31.879768    a
2021-02-28 16:41:31.879768    b
2021-03-31 16:41:31.879768    c
2021-04-30 16:41:31.879768    d
2021-05-31 16:41:31.879768    e

そして、2021年3月/4月の行を取得するために必要なものは、以下のとおりです。

>>> s3.loc['2021-03':'2021-04']
2021-03-31 17:04:30.742316    c
2021-04-30 17:04:30.742316    d

行と列

loc そして iloc は、DataFrame でも Series と同じように動作します。どちらの方法も、列と行を一緒に扱うことができることに注意してください。

タプルが与えられると、最初の要素が行のインデックスとして使用され、もし存在すれば、2番目の要素が列のインデックスとして使用されます。

以下に定義されたDataFrameを考える。

>>> import numpy as np 
>>> df = pd.DataFrame(np.arange(25).reshape(5, 5),  
                      index=list('abcde'), 
                      columns=['x','y','z', 8, 9])
>>> df
    x   y   z   8   9
a   0   1   2   3   4
b   5   6   7   8   9
c  10  11  12  13  14
d  15  16  17  18  19
e  20  21  22  23  24

では、例えば。

>>> df.loc['c': , :'z']  # rows 'c' and onwards AND columns up to 'z'
    x   y   z
c  10  11  12
d  15  16  17
e  20  21  22

>>> df.iloc[:, 3]        # all rows, but only the column at index location 3
a     3
b     8
c    13
d    18
e    23

時には、行と列のラベルと位置のインデックス作成方法を混在させ、何らかの方法で lociloc .

例えば、次のようなDataFrameを考えてみましょう。c' までの行をスライスするには、どのようにするのが最適でしょうか。 は最初の4列を取るか?

>>> import numpy as np 
>>> df = pd.DataFrame(np.arange(25).reshape(5, 5),  
                      index=list('abcde'), 
                      columns=['x','y','z', 8, 9])
>>> df
    x   y   z   8   9
a   0   1   2   3   4
b   5   6   7   8   9
c  10  11  12  13  14
d  15  16  17  18  19
e  20  21  22  23  24

この結果を得るには iloc と別のメソッドの助けを借りています。

>>> df.iloc[:df.index.get_loc('c') + 1, :4]
    x   y   z   8
a   0   1   2   3
b   5   6   7   8
c  10  11  12  13

get_loc() はインデックスメソッドで、quot;このインデックス内のラベルの位置を取得する"を意味します。なお、スライスは iloc はその終点を除くので、行 'c' も欲しい場合は、この値に 1 を加える必要があります。