Pandas:为什么在布尔索引后选择列需要双括号

时间:2015-10-29 15:11:49

标签: python pandas indexing boolean

对于如下所示的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']]

4 个答案:

答案 0 :(得分:47)

对于pandas对象(Series,DataFrame),索引操作符[]只接受

  1. colname或要选择列的列名列表
  2. 切片或布尔数组以选择行,即它仅引用数据帧的一个维度。
  3. 对于df[[colname(s)]],内部括号用于列表,外部括号是索引操作符,即如果选择两列或更多列,则必须使用双括号。使用一个列名称,单对括号返回一个Series,而双括号返回一个数据帧。

    此外,df.ix[df['A'] < 3,['A','C']]df.loc[df['A'] < 3,['A','C']]优于链式选择,以避免返回副本与数据帧的视图。

    请参阅pandas documentation了解详情

答案 1 :(得分:7)

因为您没有名为'A','C'的列,这就是您要尝试做的会引发KeyError的列,因此您必须使用iterable从df中进行子选择。

所以

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

这样您就可以在视图上操作而不是复制

答案 2 :(得分:2)

因为内部括号只是列表的python语法(文字)。

外括号是pandas dataframe对象的索引器操作。

在此用例中,内部['A', 'B']定义了将作为单个参数传递给索引器操作的列的列表,该操作由外括号表示。

答案 3 :(得分:2)

添加到以前的响应中,如果需要选择索引位置,也可以使用df.iloc访问器。这也使代码更具可重复性,这很不错。