web-dev-qa-db-ja.com

パンダ:ブールインデックス作成後に列を選択するために二重括弧が必要な理由

以下のようなdfテーブルの場合、

   A B C D
0  0 1 1 1
1  2 3 5 7
3  3 1 2 8

ブール値のインデックス付け後に特定の列を選択するために二重括弧が必要なのはなぜですか?

the [['A','C']] part of

df[df['A'] < 3][['A','C']]
25
FortuneFaded

pandasオブジェクト(Series、DataFrame)の場合、インデックス演算子[]は

  1. colnameまたは列を選択するcolnameのリスト
  2. 行を選択するためのスライスまたはブール配列。つまり、データフレームの1つの次元のみを参照します。

df[[colname(s)]]の場合、内部括弧はリスト用であり、外部括弧はインデックス演算子です。つまり、2つ以上の列を選択する場合は二重括弧を使用する必要があります。列名が1つの場合、ブラケットの単一ペアはシリーズを返し、二重ブラケットはデータフレームを返します。

また、df.ix[df['A'] < 3,['A','C']]またはdf.loc[df['A'] < 3,['A','C']]は、データフレームのビューに対してコピーを返すことを回避するために、連鎖選択よりも優れています。

詳細については pandas documentation を参照してください

52
Joseph

'A','C'という名前の列がないため、KeyErrorを発生させようとしているので、dfからサブ選択するためにiterableを使用する必要があります。

そう

df[df['A'] < 3]['A','C']

上げる

KeyError:( 'A'、 'C​​')

とは異なります

In [261]:
df[df['A'] < 3][['A','C']]

Out[261]:
   A  C
0  0  1
1  2  5

これは試すことと同じです:

df['A','C']

したがって、二重角かっこが必要な理由:

df[['A','C']]

最近の方法は.ixを使用することに注意してください:

In [264]:
df.ix[df['A'] < 3,['A','C']]

Out[264]:
   A  C
0  0  1
1  2  5

潜在的にコピーではなくビューで操作するように

9
EdChum

内側の括弧はリストのpython構文(リテラル)にすぎないためです。

外側の括弧は、pandas dataframeオブジェクトのインデクサー操作です。

このユースケースでは、内部['A', 'B']は、インデクサー操作に単一の引数としてを渡す列のリストを定義します。これは、外側の括弧で示されます。

2
Pavel Savara