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

For*_*ded 27 python indexing boolean pandas

对于如下的df表,

   A B C D
0  0 1 1 1
1  2 3 5 7
3  3 1 2 8
Run Code Online (Sandbox Code Playgroud)

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

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

df[df['A'] < 3][['A','C']]
Run Code Online (Sandbox Code Playgroud)

小智 57

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

  1. colname 或选择列的列名列表
  2. 切片或布尔数组以选择行,即它仅指数据帧的一个维度.

因为df[[colname(s)]],内部括号用于列表,外部括号是索引操作符,即如果选择两列或更多列,则必须使用双括号.使用一个列名称,单对括号返回一个Series,而双括号返回一个数据帧.

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

有关详细信息,请参阅pandas文档


EdC*_*ica 9

因为你没有命名列'A','C',这就是你要尝试做的会引发一个列KeyError,所以你必须使用一个iterable来从df中进行子选择.

所以

df[df['A'] < 3]['A','C']
Run Code Online (Sandbox Code Playgroud)

加薪

KeyError:('A','C')

哪个是不同的

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

Out[261]:
   A  C
0  0  1
1  2  5
Run Code Online (Sandbox Code Playgroud)

这与尝试没有什么不同:

df['A','C']
Run Code Online (Sandbox Code Playgroud)

因此,为什么你需要双方括号:

df[['A','C']]
Run Code Online (Sandbox Code Playgroud)

请注意,现代方式是使用.ix:

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

Out[264]:
   A  C
0  0  1
1  2  5
Run Code Online (Sandbox Code Playgroud)

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


Pav*_*ara 6

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

外括号是pandas数据框对象的索引器操作。

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