【问题标题】:Pandas Select DataFrame columns using booleanPandas 使用布尔值选择 DataFrame 列
【发布时间】:2015-05-30 16:01:04
【问题描述】:

我想使用布尔值从包含超过 1,000 列的数据框 comb 中选择包含超过 4000 个条目的列。这个表达式给了我一个布尔(真/假)结果:

criteria = comb.ix[:,'c_0327':].count()>4000

我想用它来只选择 True 列到一个新的数据框。
以下只是给了我“提供了不可对齐的布尔系列键”:

comb.loc[criteria,]

我也试过了:

comb.ix[:, comb.ix[:,'c_0327':].count()>4000] 

类似这个问题的答案dataframe boolean selection along columns instead of row 但这给了我同样的错误:“提供了不可对齐的布尔系列键”

comb.ix[:,'c_0327':].count()>4000

产量:

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
.....

【问题讨论】:

  • 你不想comb[criteria.columns]吗?
  • comb[criteria.columns] 给我“'Series'对象没有属性'columns'”

标签: python pandas


【解决方案1】:

返回的是一个以列名作为索引、布尔值作为行值的系列。

我认为实际上你想要:

现在应该可以工作了:

comb[criteria.index[criteria]]

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

【讨论】:

  • 我很惊讶地看到,没有更短(更直接)的方法可以做到这一点。
  • 有,这个答案已有 5 年历史且已过时。直接的方法见下面的my answer
  • @johnDanger 不错的答案,但我不确定我是否同意从“m[f] 用于行过滤”到“m.loc[:,f] 用于列过滤”很简单。
  • @johnDanger 的回答中的“直截了​​当”是您只需要一次 criteria,因此您不需要单独定义变量(但可以只使用表达式本身 ion m.loc[:, expression_of_criteria_itself]) .
【解决方案2】:

你也可以使用:

# 过滤列(假设条件长度等于梳子的列数) comb.ix[:, 标准] comb.iloc[:, criteria.values] # 过滤行(假设条件长度等于梳的行数) 梳子[标准]

【讨论】:

  • 第一个答案看起来最优雅的掩码列选择。唯一的技巧是需要做comb.iloc[:, criteria.values],因为系列不是iloc这种类型切片的有效参数
  • 我应该指定我期望标准是一个布尔列表。很好的收获。
【解决方案3】:

我在用这个,比较干净

comb.values[:,criteria]

信用:https://stackoverflow.com/a/43291257/815677

【讨论】:

  • 为了清楚起见,这将返回 numpy.ndarray,而不是 pandas.DataFrame
【解决方案4】:

在熊猫 0.25 中:

comb.loc[:, criteria]

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

对于多个条件:

comb.loc[:, criteria1 & criteria2]

对于选择具有索引条件的行:

comb[criteria]

注意: 需要按位运算符&(不是and)。见Logical operators for boolean indexing in Pandas

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

【讨论】:

    【解决方案5】:

    另一种解决方案是转置comb 以使其列充当其索引,然后转置结果子集:

    comb.T[criteria].T
    

    同样,不是特别优雅,但至少比领先的解决方案更短/更少重复。

    【讨论】:

    • 已经提出了一些解决方案,这些解决方案比公认的解决方案更短/重复性更低,但也更优雅。
    【解决方案6】:

    您可以将布尔数组传递给loc,以指示哪些列应该保留,哪些不应该保留。

    例如,

    >>> df
        A   B   C   D    E
    0  73  15  55  33  foo
    1  63  64  11  11  bar
    2  56  72  57  55  foo
    
    >>> df.loc[:, [True, True, False, False, True]]
        A   B    E
    0  73  15  foo
    1  63  64  bar
    2  56  72  foo
    

    【讨论】:

      猜你喜欢
      • 2019-05-25
      • 1970-01-01
      • 2021-12-01
      • 2021-08-03
      • 1970-01-01
      • 2021-09-08
      • 2018-11-25
      • 2018-03-27
      • 1970-01-01
      相关资源
      最近更新 更多