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

Posted

技术标签:

【中文标题】Pandas:为啥在布尔索引后需要双括号来选择列【英文标题】:Pandas: Why are double brackets needed to select column after boolean indexingPandas:为什么在布尔索引后需要双括号来选择列 【发布时间】:2016-01-29 19:36:02 【问题描述】:

对于像下面这样的 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']]

【问题讨论】:

【参考方案1】:

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

    colname 或选择列的列名列表 切片或布尔数组来选择行,即它只引用数据帧的一维。

对于df[[colname(s)]],内括号是列表,外括号是索引运算符,即如果选择两列或多列,则必须使用双括号。对于一个列名,单对括号返回一个系列,而双括号返回一个数据框。

此外,df.ix[df['A'] &lt; 3,['A','C']]df.loc[df['A'] &lt; 3,['A','C']] 比链式选择更能避免返回副本而不是数据框的视图。

详情请咨询pandas documentation

【讨论】:

谢谢。我将选择这个,因为它详细介绍了外部支架的用途,这让我感到困惑。正如你们都提到的,我将开始使用 .ix,这对我来说更有意义/读起来更好。【参考方案2】:

因为您没有名为 'A','C' 的列,而这正是您尝试执行的操作,这将引发 KeyError,因此您必须使用可迭代对象从 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

这样您是在视图上操作而不是潜在的副本

【讨论】:

谢谢。当把它放在 .ix 形式时,它更有意义。我被双括号的意思吓坏了。【参考方案3】:

因为内括号只是列表的 Python 语法(字面量)。

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

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

【讨论】:

【参考方案4】:

除了之前的响应,如果您需要选择索引位置,还可以使用df.iloc 访问器。它还使代码更具可重复性,这很好。

【讨论】:

以上是关于Pandas:为啥在布尔索引后需要双括号来选择列的主要内容,如果未能解决你的问题,请参考以下文章

python--pandas切片

获取 pandas 布尔系列为 True 的索引列表

pandas使用iloc函数基于dataframe数据列的索引抽取单列或者多列数据其中多列索引需要嵌入在列表方括号[]中或使用:符号形成起始和终止范围索引

pandas使用iloc函数基于dataframe数据行(row)的索引抽取单行或者多行数据其中多行索引需要嵌入在列表方括号[]中或使用:符号形成起始和终止范围索引

Pandas,用于布尔索引的 loc 与非 loc

在 Pandas 数据框布尔索引中使用“相反布尔值”的正确方法