1. ホーム
  2. python

[解決済み] Pandasのデータフレームで複数の列を選択する

2022-03-15 23:43:08

質問

異なる列にデータがあるのですが、それを抽出して別の変数に保存する方法がわかりません。

index  a   b   c
1      2   3   4
2      3   4   5

を選択するにはどうすればよいのでしょうか? 'a' , 'b' で、それをdf1に保存してください。

試してみた

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

どれもうまくいかないようです。

解決方法は?

列名(文字列)は、あなたが試した方法ではスライスできません。

ここで、いくつかのオプションがあります。コンテキストからどの変数をスライスしたいのかがわかっている場合は __getitem__ 構文 (の部分)。

df1 = df[['a', 'b']]

また、名前ではなく数値でインデックスを作成することが重要な場合(例えば、最初の2つの列の名前を知らなくても、コードが自動的にこれを行うはずです)、代わりに次のようにすることができます。

df1 = df.iloc[:, 0:2] # Remember that Python does not slice inclusive of the ending index.

さらに、Pandasオブジェクトへのビューとそのオブジェクトのコピーの考え方に慣れる必要があります。上記のメソッドのうち最初のものは、目的のサブオブジェクト(目的のスライス)のメモリ内の新しいコピーを返します。

しかし、時々、Pandasのインデックス付けの慣習で、これを行わず、代わりに元のオブジェクトのサブオブジェクトやスライスと同じメモリのチャンクを参照するだけの新しい変数を与えることがあります。これは2番目のインデックスの方法で起こるので、それを修正するために .copy() メソッドで通常のコピーを取得します。このような場合、スライスされたオブジェクトと思われるものを変更すると、時に元のオブジェクトが変更されることがあります。常にこのことに気をつけるとよいでしょう。

df1 = df.iloc[0, 0:2].copy() # To avoid the case where changing df1 also changes df

を使用する場合 iloc の場合、列の位置(またはインデックス)を知っている必要があります。列の位置は変化する可能性があるので、インデックスをハードコーディングする代わりに iloc とともに get_loc の機能 columns メソッドを使用して、列のインデックスを取得します。

{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}

これで、この辞書を使って、名前と iloc .