Pandas根据布尔条件选择行和列

Soc*_*key 2 python conditional dataframe pandas

我有一个大约50列和> 100行的pandas数据帧.我想选择列'col_x','col_y'在哪里'col_z' < m.有一个简单的方法来做到这一点,类似于df[df['col3'] < m]df[['colx','coly']],但结合起来呢?

cs9*_*s95 9

让我们分解你的问题.你想要

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

首先,您需要的条件是 -

df["col_z"] < m
Run Code Online (Sandbox Code Playgroud)

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

["col_x", "col_y"]
Run Code Online (Sandbox Code Playgroud)

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

df.loc[df["col_z"] < m, ["col_x", "col_y"]]
Run Code Online (Sandbox Code Playgroud)

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


更多关于 loc

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

SELECT col_x, col_y     # projection on columns
FROM df
WHERE col_z < m         # selection on rows
Run Code Online (Sandbox Code Playgroud)

pandasloc允许您指定用于选择行的索引标签.例如,如果您有数据框 -

   col_x  col_y
a      1      4
b      2      5
c      3      6
Run Code Online (Sandbox Code Playgroud)

要选择索引a,并且c,col_x您将使用 -

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

   col_x
a      1
c      3
Run Code Online (Sandbox Code Playgroud)

或者,通过布尔条件进行选择(使用一系列bool值/数组,如原始问题所示),其中所有值col_x都是奇数 -

df.loc[(df.col_x % 2).ne(0), ['col_y']]

   col_y
a      4
c      6
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请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
Run Code Online (Sandbox Code Playgroud)

进一步阅读