1. ホーム
  2. python

[解決済み] Python Pandasシリーズ - なぜlocを使うのか?

2022-12-01 23:47:57

質問

なぜ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を使うのか?

編集してください。 これは重複した質問としてフラグが立っています。しかし pandas iloc vs ix vs locの説明? はその*を言及します。

を使うだけでカラムの検索ができます。 getitem :

*

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

には、なぜlocを使うのかは書かれていませんが、locの特徴についてはたくさん説明されています。

また、そのほかの投稿では、答え (答えではないと思いますが) が議論の中に隠れていて、私が探していたものを探している人は、情報を見つけるのが難しく、私の質問に対して提供された答えによってはるかに良いサービスを受けることができます。

どのように解決するのですか?

  • 暗黙的ではなく、明示的であることが望ましい。

    df[boolean_mask] が存在する行を選択します。 boolean_mask が True である行を選択しますが、そうさせたくない場合もあります。 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.loc の構文の意味は明示的だからです。とは df.loc[indexer] では、自動的に df.loc が行を選択していることが自動的にわかる。これに対して df[indexer] が行を選択するのか列を選択するのか(あるいは ValueError の詳細を知らなくても indexerdf .

  • df.loc[row_indexer, column_index] 行を選択することができます の列を選択することができます。 df[indexer] は行のみを選択することができます。 または の値の種類によって indexer の値の種類と、カラムの値の種類 df が持っているカラムの値の種類(これもブーリアンか?)

    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