我有一个大约50列和> 100行的pandas数据帧。我想选择'col_x'
,'col_y'
列'col_z' < m
。有没有一种简单的方法可以做到这一点,类似于df[df['col3'] < m]
和df[['colx','coly']]
,但结合了?
答案 0 :(得分:8)
让我们分解你的问题。你想要
首先,您需要的条件是 -
df["col_z"] < m
对于第二个要求,您需要指定所需的列列表 -
["col_x", "col_y"]
你如何将这两者结合起来产生熊猫的预期输出?最直接的方法是使用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
要选择索引a
,c
和col_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
进一步阅读