ラベルと場所
2 つの方法の主な違いは次のとおりです。
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
さまざまなオブジェクトが渡されたときs.loc
の相違点/類似点の一部を次に示します。s.iloc
<オブジェクト> |
説明 |
s.loc[<object>] |
s.iloc[<object>] |
0 |
単品 |
インデックスラベル 0 の値 (文字列'd' ) |
インデックス位置0 の値 (文字列'a' ) |
0:1 |
スライス |
2行 (ラベル0 と1 ) |
1行 (位置 0 の最初の行) |
1:47 |
範囲外の端を持つスライス |
ゼロ行 (空のシリーズ) |
5列 (ロケーション 1 以降) |
1:47:-1 |
負のステップでスライス |
3行 (ラベル1 を に戻す47 ) |
ゼロ行 (空のシリーズ) |
[2, 0] |
整数リスト |
指定されたラベルを持つ2 つの行 |
指定された位置を持つ2 つの行 |
s > 'e' |
ブール系列 (プロパティを持つ値を示す) |
1行 ( を含む'f' ) |
NotImplementedError |
(s>'e').values |
ブール配列 |
1行 ( を含む'f' ) |
と同じloc |
999 |
インデックスにない int オブジェクト |
KeyError |
IndexError (立入禁止で) |
-1 |
インデックスにない int オブジェクト |
KeyError |
の最後の値を返しますs |
lambda x: x.index[3] |
シリーズに適用される callable (ここでは、インデックスの3番目の項目を返します) |
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
、 を使用してシリーズの最初の値を取得できます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
同じように、DataFrames でも同じように機能します。どちらの方法でも、列と行を一緒にアドレス指定できることに注意してください。
タプルを指定すると、最初の要素が行のインデックスに使用され、存在する場合は 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
と の機能を組み合わせて、行と列のラベルと位置インデックスのメソッドを組み合わせたい場合がloc
ありiloc
ます。
たとえば、次の 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()
「このインデックス内のラベルの位置を取得する」という意味のインデックスメソッドです。でのスライスiloc
はそのエンドポイントを除外するため、行 'c' も必要な場合は、この値に 1 を追加する必要があることに注意してください。