【问题标题】: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']]

【问题讨论】:

    标签: python pandas indexing boolean


    【解决方案1】:

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

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

    对于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 访问器。它还使代码更具可重复性,这很好。

      【讨论】:

        猜你喜欢
        • 2021-06-06
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 2016-02-08
        • 1970-01-01
        • 2014-08-09
        • 2018-10-25
        • 1970-01-01
        相关资源
        最近更新 更多