【问题标题】:Pandas select rows and columns based on boolean conditionPandas 根据布尔条件选择行和列
【发布时间】:2018-06-10 15:43:42
【问题描述】:

我有一个大约 50 列和 >100 行的 pandas 数据框。我想选择列'col_x''col_y' 其中'col_z' < m。有没有一种简单的方法可以做到这一点,类似于df[df['col3'] < m]df[['colx','coly']] 但结合起来?

【问题讨论】:

    标签: python pandas dataframe conditional


    【解决方案1】:

    让我们分解您的问题。你想

    1. 根据一些布尔条件过滤行
    2. 您想从结果中选择列的子集。

    对于第一点,您需要的条件是 -

    df["col_z"] < m
    

    对于第二个要求,您需要指定所需的列列表 -

    ["col_x", "col_y"]
    

    您将如何将这两者结合起来使用 pandas 产生预期的输出?最直接的方法是使用loc -

    df.loc[df["col_z"] < m, ["col_x", "col_y"]]
    

    第一个参数选择行,第二个参数选择列。


    更多关于loc

    从关系代数运算的角度来考虑这一点 - 选择投影。如果您来自 SQL 世界,这将是一个相关的等价物。上面的操作,在 SQL 语法中,看起来像这样 -

    SELECT col_x, col_y     # projection on columns
    FROM df
    WHERE col_z < m         # selection on rows
    

    pandas loc 允许您指定索引标签以选择行。例如,如果您有一个数据框 -

       col_x  col_y
    a      1      4
    b      2      5
    c      3      6
    

    要选择索引 accol_x,您将使用 -

    df.loc[['a', 'c'], ['col_x']]
    
       col_x
    a      1
    c      3
    

    或者,通过布尔条件进行选择(使用一系列/数组bool 值,正如您最初的问题所问的那样),其中col_x 中的所有值都是奇数 -

    df.loc[(df.col_x % 2).ne(0), ['col_y']]
    
       col_y
    a      4
    c      6
    

    有关详细信息,df.col_x % 2 计算每个值相对于2 的模数。然后ne(0) 将该值与0 进行比较,如果不是,则返回True(所有奇数都是这样选择的)。这是该表达式的结果 -

    (df.col_x % 2).ne(0)
    
    a     True
    b    False
    c     True
    Name: col_x, dtype: bool
    

    进一步阅读

    【讨论】:

      猜你喜欢
      • 2016-11-02
      • 1970-01-01
      • 2017-09-23
      • 2021-11-17
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 2019-08-25
      相关资源
      最近更新 更多