100

pandas データフレームに「loc」を使用するのはなぜですか? loc を使用して、または使用せずに、次のコードのように思われます。

%timeit df_user1 = df.loc[df.user_id=='5561']

100 loops, best of 3: 11.9 ms per loop

また

%timeit df_user1_noloc = df[df.user_id=='5561']

100 loops, best of 3: 12 ms per loop

では、なぜ loc を使用するのでしょうか。

編集:これは重複した質問としてフラグが立てられています。しかし、パンダ iloc 対 ix 対 loc の説明はありますか? それについて言及しています*

データ フレームのgetitemを使用するだけで、列の取得を行うことができます 。

*

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

loc を使用する理由については述べていませんが、loc の多くの機能について説明していますが、私の具体的な質問は、「なぜ loc を完全に省略しないのか」ということです。以下の非常に詳細な回答を受け入れました。

また、他の投稿の回答(私は回答ではないと思います)は議論に非常に隠されているため、私が探していたものを探している人は情報を見つけるのが難しく、提供された回答によってはるかに役立つでしょう.私の質問に。

4

3 に答える 3

90
  • 明示的は暗黙的よりも優れています。

    df[boolean_mask]が True の行を選択しますboolean_maskが、それが望ましくない場合もあります:dfブール値の列ラベルがある場合:

    In [229]: df = pd.DataFrame({True:[1,2,3],False:[3,4,5]}); df
    Out[229]: 
       False  True 
    0      3      1
    1      4      2
    2      5      3
    

    を使用df[[True]]して列を選択できTrueます。代わりに、次の例外が発生しValueErrorます。

    In [230]: df[[True]]
    ValueError: Item wrong length 1 instead of 3.
    

    対使用loc

    In [231]: df.loc[[True]]
    Out[231]: 
       False  True 
    0      3      1
    

    対照的に、次ValueErrorの構造は上記df2とほぼ同じですが、発生しません。df1

    In [258]: df2 = pd.DataFrame({'A':[1,2,3],'B':[3,4,5]}); df2
    Out[258]: 
       A  B
    0  1  3
    1  2  4
    2  3  5
    
    In [259]: df2[['B']]
    Out[259]: 
       B
    0  3
    1  4
    2  5
    

    したがって、df[boolean_mask]常に と同じように動作するとは限りませんdf.loc[boolean_mask]。これは間違いなくありそうもない使用例ですが、の構文の意味が明示的であるため、df.loc[boolean_mask]代わりに常に使用することをお勧めします。行を選択していることは自動的にわかります。対照的に、 が行または列を選択する (または を発生させる) かどうかは、および の詳細を知らなければ明確ではありません。df[boolean_mask]df.locdf.loc[indexer]df.locdf[indexer]ValueErrorindexerdf

  • df.loc[row_indexer, column_index]行と列を選択できます。の値のタイプと列の値のタイプに応じて、行またはdf[indexer]列のみを選択できます(繰り返しますが、それらはブール値ですか?)。indexerdf

    In [237]: df2.loc[[True,False,True], 'B']
    Out[237]: 
    0    3
    2    5
    Name: B, dtype: int64
    
  • df.locスライスがエンドポイントに渡されると、範囲に含まれます。スライスが に渡されるdf[...]と、スライスは半分開いた間隔として解釈されます。

    In [239]: df2.loc[1:2]
    Out[239]: 
       A  B
    1  2  4
    2  3  5
    
    In [271]: df2[1:2]
    Out[271]: 
       A  B
    1  2  4
    
于 2016-08-11T02:08:40.420 に答える