对于如下所示的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']]
答案 0 :(得分:47)
对于pandas对象(Series,DataFrame),索引操作符[]只接受
colname
或要选择列的列名列表对于df[[colname(s)]]
,内部括号用于列表,外部括号是索引操作符,即如果选择两列或更多列,则必须使用双括号。使用一个列名称,单对括号返回一个Series,而双括号返回一个数据帧。
此外,df.ix[df['A'] < 3,['A','C']]
或df.loc[df['A'] < 3,['A','C']]
优于链式选择,以避免返回副本与数据帧的视图。
请参阅pandas documentation了解详情
答案 1 :(得分:7)
因为您没有名为'A','C'
的列,这就是您要尝试做的会引发KeyError
的列,因此您必须使用iterable从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
这样您就可以在视图上操作而不是复制
答案 2 :(得分:2)
因为内部括号只是列表的python语法(文字)。
外括号是pandas dataframe对象的索引器操作。
在此用例中,内部['A', 'B']
定义了将作为单个参数传递给索引器操作的列的列表,该操作由外括号表示。
答案 3 :(得分:2)
添加到以前的响应中,如果需要选择索引位置,也可以使用df.iloc
访问器。这也使代码更具可重复性,这很不错。