【发布时间】: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
对于像下面这样的 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
对于pandas对象(Series、DataFrame),索引操作符[]只接受
colname 或选择列的列名列表对于df[[colname(s)]],内括号是列表,外括号是索引运算符,即如果选择两列或多列,则必须使用双括号。对于一个列名,单对括号返回一个系列,而双括号返回一个数据框。
此外,df.ix[df['A'] < 3,['A','C']] 或 df.loc[df['A'] < 3,['A','C']] 比链式选择更能避免返回副本而不是数据框的视图。
详情请咨询pandas documentation
【讨论】:
因为您没有名为 '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
这样您是在视图上操作而不是潜在的副本
【讨论】:
因为内括号只是列表的 Python 语法(字面量)。
外括号是pandas dataframe对象的索引器操作。
在这个用例中,内部['A', 'B'] 定义了列列表,以将作为单个参数传递给索引器操作,用外括号表示。
【讨论】:
除了之前的响应,如果您需要选择索引位置,还可以使用df.iloc 访问器。它还使代码更具可重复性,这很好。
【讨论】: