Pandas使用boolean选择DataFrame列

dar*_*dog 19 python pandas

以下标准给出了布尔真假结果(梳子是一个超过1,000列的数据帧,我选择的列数超过4000.

criteria = comb.ix[:,'c_0327':].count()>4000
Run Code Online (Sandbox Code Playgroud)

我想用它来选择True列到新的Dataframe.
以下只给出了"Unalignable boolean Series key"

comb.loc[criteria,]
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

comb.ix[:, comb.ix[:,'c_0327':].count()>4000] 
Run Code Online (Sandbox Code Playgroud)

类似于这个问题回答数据框布尔选择沿列而不是行, 但这给了我同样的错误:"提供了不可对齐的布尔系列键"

comb.ix[:,'c_0327':].count()>4000
Run Code Online (Sandbox Code Playgroud)

收益率:

c_0327    False
c_0328    False
c_0329    False
c_0330    False
c_0331    False
c_0332    False
c_0333    False
c_0334    False
c_0335    False
c_0336    False
c_0337     True
c_0338    False
.....
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 25

返回的是一个Series,列名作为索引,布尔值作为行值.

我想你真的想要:

这应该工作:

comb[criteria.index[criteria]]
Run Code Online (Sandbox Code Playgroud)

基本上,这使用来自条件的索引值和布尔值来掩盖它们,这将返回一个列名称数组,我们可以使用它来从orig df中选择感兴趣的列.

  • 我很惊讶地看到,没有更短(更直接)的方法可以做到这一点。 (3认同)
  • 还有,这个答案已经有5年历史了,已经过时了。请参阅下面的[我的答案](/sf/answers/4030459401/)了解简单的方法 (2认同)

joh*_*ger 19

在熊猫 0.25 中:

comb.loc[:, criteria]
Run Code Online (Sandbox Code Playgroud)

返回一个 DataFrame,其中的列由布尔列表或系列选择。

对于多个条件:

comb.loc[:, criteria1 & criteria2]
Run Code Online (Sandbox Code Playgroud)

并选择具有索引条件的行:

comb[criteria]
Run Code Online (Sandbox Code Playgroud)

注意&需要按位运算符(不是and)。请参阅Pandas 中布尔索引的逻辑运算符

其他注意:如果条件是一个表达式(例如,comb.columnX > 3),并且使用了多个条件,请记住将每个表达式括在括号中!这是因为&, |具有更高的优先级>, ==, ect.(而and, or优先级较低)。


Yoh*_*dia 7

您还可以使用:

# To filter columns (assuming criteria length is equal to the number of columns of comb)
comb.ix[:, criteria]
comb.iloc[:, criteria.values]

# To filter rows (assuming criteria length is equal to the number of rows of comb)
comb[criteria]

  • 对于屏蔽列选择,第一个答案看起来最优雅.唯一的技巧是需要做`comb.iloc [:,criteria.values]`,因为一个系列不是这种类型的'iloc`切片的有效参数 (2认同)