[解決済み] Python Pandasシリーズ - なぜlocを使うのか?
質問
なぜ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
の詳細を知らなくてもindexer
とdf
. -
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
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] Pandasのカラム名のリネーム
-
[解決済み] Pandas DataFrameからカラムを削除する
-
[解決済み] Pandasシリーズ/DataFrame全体をプリティプリントする
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PandasでSettingWithCopyWarningに対処する方法
-
[解決済み】ilocとlocはどう違うのですか?
-
[解決済み] Python 3でバイナリデータを標準出力に書き込むには?
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] Python 言語を決定するには?
-
[解決済み] Pythonの文字列書式をリストで使う
-
[解決済み] Pandas/Pythonでカラムのフィルタリングにlocを使うのと角括弧だけを使うのでは何が違うのでしょうか?