815

これら 2 つのスライス方法の違いを説明できる人はいますか?
私はdocs を見てきましたが、これらの 回答を見てきましたが、それでも 3 つの違いを理解できません。私には、それらはスライスのレベルが低いため、大部分は互換性があるように見えます。

たとえば、 a の最初の 5 行を取得したいとしますDataFrame。この 2 つがどのように機能するのでしょうか。

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

用途の違いがより明確な 3 つのケースを誰か提示できますか?


むかしむかし、これらの 2 つの関数が pandas 1.0 から削除されたのとどのように異なるのかを知りたかったdf.ix[:5]のでix、もう気にしません。

4

5 に答える 5

1298

ラベル場所

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

さまざまなオブジェクトが渡されたときs.locの相違点/類似点の一部を次に示します。s.iloc

<オブジェクト> 説明 s.loc[<object>] s.iloc[<object>]
0 単品 インデックスラベル 0の値 (文字列'd') インデックス位置0 の値 (文字列'a')
0:1 スライス 2行 (ラベル01) 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 を追加する必要があることに注意してください。

于 2015-07-23T16:59:47.117 に答える
166

iloc整数位置に基づいて動作します。したがって、行ラベルが何であれ、いつでも次のようにして最初の行を取得できます。

df.iloc[0]

または実行して最後の5行

df.iloc[-5:]

柱にも使えます。これは 3 番目の列を取得します。

df.iloc[:, 2]    # the : in the first position indicates all rows

それらを組み合わせて、行と列の交点を取得できます。

df.iloc[:3, :3] # The upper-left 3 X 3 entries (assuming df has 3+ rows and columns)

一方、.loc名前付きインデックスを使用します。行と列のラベルとして文字列を使用してデータ フレームを設定しましょう。

df = pd.DataFrame(index=['a', 'b', 'c'], columns=['time', 'date', 'name'])

次に、最初の行を取得できます

df.loc['a']     # equivalent to df.iloc[0]

列の次の 2 行は'date'by

df.loc['b':, 'date']   # equivalent to df.iloc[1:, 1]

等々。DataFrameここで、a のデフォルトの行インデックスと列インデックスは 0 からの整数であり、この場合ilocloc同じように機能することを指摘する価値があるでしょう。これが、3 つの例が同等である理由です。文字列や日時などの数値以外のインデックスがある場合は df.loc[:5] 、エラーが発生します。

また、データ フレームの__getitem__:

df['time']    # equivalent to df.loc[:, 'time']

ここで、位置インデックスと名前付きインデックスを混在させたいとします。つまり、行の名前と列の位置を使用してインデックスを作成するとします (明確にするために、行インデックスに文字列を、整数に整数を含むデータ フレームを作成するのではなく、データ フレームから選択することを意味します)。列インデックス)。これが.ix出番です:

df.ix[:2, 'time']    # the first two rows of the 'time' column

メソッドにブール値ベクトルを渡すこともできることにも言及する価値があると思いますloc。例えば:

 b = [True, False, True]
 df.loc[b] 

の 1 行目と 3 行目を返しますdf。これは選択と同等ですdf[b]が、ブール値ベクトルを介した割り当てにも使用できます。

df.loc[b, 'name'] = 'Mary', 'John'
于 2015-07-23T17:17:27.827 に答える