Pandas DataFrame で列を選択する方法は 3 つあることに気づきました。
loc を使用して列を選択する最初の方法:
df_new = df.loc[:, 'col1']
2 番目の方法 - よりシンプルで高速です:
df_new = df['col1']
3番目の方法 - 最も便利:
df_new = df.col1
これら 3 つの方法には違いがありますか? 違いはないと思います。その場合は、3 番目の方法を使用することをお勧めします。
私が最も興味を持っているのは、同じことを行うのになぜ 3 つの方法があるように見えるのかということです。
ベストアンサー1
以下の状況では、それらは同じように動作します。
- 1つの列を選択する(->列Aを選択する
df['A']
のと同じ)df.loc[:, 'A']
- 列のリストを選択する (
df[['A', 'B', 'C']]
と同じですdf.loc[:, ['A', 'B', 'C']]
-> 列 A、B、C を選択します) - 行でスライスする(は->
df[1:3]
と同じです。行1と行2を選択します。ただし、行をではなくdf.iloc[1:3]
でスライスすると、行1、2、3が取得されます。loc
iloc
範囲インデックス。 詳細を見るここ。
ただし、[]
次の状況では機能しません。
- 1行を選択するには
df.loc[row_label]
- 行のリストを選択するには
df.loc[[row_label1, row_label2]]
- 列をスライスするには
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
)。それ以外は、.
とは[]
同じです。