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

51

对于下面的 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个回答

99
对于pandas对象(Series,DataFrame),索引运算符[]仅接受以下内容:
  1. colname或colnames列表以选择列
  2. 切片或布尔数组以选择行,即它仅涉及数据帧的一个维度。
对于df[[colname(s)]],内部方括号用于列表,而外部方括号用于索引操作符,即如果要选择两个或多个列,则必须使用双重方括号。对于一个列名,单个括号返回一个Series,而双括号返回一个数据框。
此外,为了避免返回数据框的副本而不是视图,df.ix[df['A'] < 3,['A','C']]df.loc[df['A'] < 3,['A','C']]更好。
有关详细信息,请参阅pandas文档

1
谢谢。我会选择这个答案,因为它详细解释了外部括号的作用,这一点曾经让我感到困惑。正如你们两位提到的,我将开始使用.ix,这对我来说更有意义/更易读。 - FortuneFaded

14

由于您没有名为'A','C'的列,这就是您尝试执行的操作,这将引发KeyError,因此您必须使用可迭代对象从df中进行子选择。

所以

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

引发

关键错误:('A','C')

这与

>>> df[df['A'] < 3][['A','C']]
   A  C
0  0  1
1  2  5

这与尝试没有区别:

df['A','C']

因此你需要双方括号:
df[['A','C']]

请注意,现代的方法是使用.loc
>>> df.loc[df['A'] < 3,['A','C']]
   A  C
0  0  1
1  2  5

这样你就可以在视图上操作,而不是潜在的副本


谢谢。将其放入 .ix 格式中,它会更加有意义。我被双括号的含义所迷惑。 - FortuneFaded

10

由于内部括号只是 Python 语法(文字)中的列表。

外部括号是 Pandas 数据帧对象的索引器操作。

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


这非常简单,然而并不直观。谢谢! - Sergey Belonozhko

3

除了之前的回答,如果需要选择索引位置,你也可以使用df.iloc访问器。这样做还可以使代码更具可重复性,这很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接