以下のような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']]
pandasオブジェクト(Series、DataFrame)の場合、インデックス演算子[]は
colname
または列を選択するcolnameのリストdf[[colname(s)]]
の場合、内部括弧はリスト用であり、外部括弧はインデックス演算子です。つまり、2つ以上の列を選択する場合は二重括弧を使用する必要があります。列名が1つの場合、ブラケットの単一ペアはシリーズを返し、二重ブラケットはデータフレームを返します。
また、df.ix[df['A'] < 3,['A','C']]
またはdf.loc[df['A'] < 3,['A','C']]
は、データフレームのビューに対してコピーを返すことを回避するために、連鎖選択よりも優れています。
詳細については pandas documentation を参照してください
'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
潜在的にコピーではなくビューで操作するように
内側の括弧はリストのpython構文(リテラル)にすぎないためです。
外側の括弧は、pandas dataframeオブジェクトのインデクサー操作です。
このユースケースでは、内部['A', 'B']
は、インデクサー操作に単一の引数としてを渡す列のリストを定義します。これは、外側の括弧で示されます。