Pandas/Python で列をフィルター処理する場合、loc を使用する場合と角括弧のみを使用する場合の違いは何ですか? 質問する

Pandas/Python で列をフィルター処理する場合、loc を使用する場合と角括弧のみを使用する場合の違いは何ですか? 質問する

Pandas DataFrame で列を選択する方法は 3 つあることに気づきました。

loc を使用して列を選択する最初の方法:

df_new = df.loc[:, 'col1']

2 番目の方法 - よりシンプルで高速です:

df_new = df['col1']

3番目の方法 - 最も便利:

df_new = df.col1

これら 3 つの方法には違いがありますか? 違いはないと思います。その場合は、3 番目の方法を使用することをお勧めします。

私が最も興味を持っているのは、同じことを行うのになぜ 3 つの方法があるように見えるのかということです。

ベストアンサー1

以下の状況では、それらは同じように動作します。

  1. 1つの列を選択する(->列Aを選択するdf['A']のと同じ)df.loc[:, 'A']
  2. 列のリストを選択する (df[['A', 'B', 'C']]と同じですdf.loc[:, ['A', 'B', 'C']]-> 列 A、B、C を選択します)
  3. 行でスライスする(は->df[1:3]と同じです。行1と行2を選択します。ただし、行をではなくdf.iloc[1:3]でスライスすると、行1、2、3が取得されます。lociloc範囲インデックス。 詳細を見るここ

ただし、[]次の状況では機能しません。

  1. 1行を選択するにはdf.loc[row_label]
  2. 行のリストを選択するにはdf.loc[[row_label1, row_label2]]
  3. 列をスライスするにはdf.loc[:, 'A':'C']

これら 3 つは では実行できません[]。さらに重要なのは、選択に行と列の両方が含まれる場合、割り当てが問題になるということです。

df[1:3]['A'] = 5

これは行1と2を選択し、返されるオブジェクトの列「A」を選択し、値5を割り当てます。問題は、返されるオブジェクトがコピーである可能性があるため、実際のデータフレームが変更されない可能性があることです。これにより、コピー警告付き設定この割り当てを正しく行う方法は次のとおりです。

df.loc[1:3, 'A'] = 5

を使用すると.loc、元の DataFrame が変更されることが保証されます。また、列をスライスしたり ( df.loc[:, 'C':'F'])、単一の行を選択したり ( df.loc[5])、行のリストを選択したり ( df.loc[[1, 2, 5]]) することもできます。

また、これら 2 つは同時に API に含まれていなかったことに注意してください。これは、.locより強力で明示的なインデクサーとして後から追加されました。unutbuの回答詳細については。


注: []vsを使用して列を取得すること.は、まったく別のトピックです。.は便宜上のみ存在します。名前が有効な Python 識別子である列にのみアクセスできます (つまり、スペースを含めることができず、数字で構成することはできません...)。名前が Series/DataFrame メソッドと競合する場合は使用できません。また、存在しない列に使用することもできません (つまり、df.a = 1列がない場合、割り当ては機能しませんa)。それ以外は、.とは[]同じです。

おすすめ記事