基于布尔条件对 Pandas 数据帧进行子集化 - 为什么顺序不重要?

Subsetting Pandas dataframe based on Boolean condition - why doesn't order matter?

我的问题是 Python pandas。假设我们有 pandas 数据框 df,其中包含两列“A”和“B”。我子集到 select 列“B”的所有值,其中列“A”的条目等于“值”。为什么以下命令的顺序无关紧要?

df[df["A"]=="value"]["B"]

Returns同代码

df["B"][df["A"]=="value"]

您能解释一下为什么它们的工作原理相同吗?谢谢

第一种形式select行后列比第二种select列后行

您可以 select 行和列同时 loc:

df.loc[df['A'] == 'value', 'B']

请阅读Evaluation order matters

代码的 df["A"]=="value" 部分 returns a pandas 包含符合条件的布尔值的系列 ("A" == "value" ). 通过在您的 DataFrame returns 上放置一个系列掩码(基本上是一个过滤器),一个 DataFrame 仅包含您在 Series 掩码中具有 True 的行上的值。 因此,在您的第一个代码( df[df["A"]=="value"]["B"] )中,您在 DataFrame 上应用特定掩码,仅获取列“A”相等的行到“价值”,然后你从你的DataFrame中提取“B”列。 在你的第二个代码中,你首先选择列“B”,然后你只选择初始 DataFrame 中列“A”==“value”的行。 希望这对您有所帮助!

假设您有两张 sheet 的 standard-sized 纵向打印纸。您想要一个非常特殊的矩形,其 top-left 角位于 sheet 纸的正中心,宽度为 1 厘米,高度为 3 厘米。

第一种方式:

第 1 步:对于第一个 sheet,您用一把剪刀做了两个垂直切口,一个恰好在中间,一个在中间右侧一厘米处。您丢弃左右两块,只保留 1 厘米宽的条带。这在概念上类似于对数据帧执行 df["B"] 以仅 select 列为 B.

的系列

第 2 步:然后用剪刀横向剪两刀,一条正好在中间,一条在第一次剪下三厘米处。你丢弃顶部和底部的部分,只保留 3 厘米高(和 1 厘米宽)的矩形。这在概念上类似于从系列 df["B"] 开始(我们称这个系列为 X),然后执行 X[df["A"]=="value"] 以获得 X 中满足逻辑条件 df["A"]=="value".

第二种方式:

第 1 步:对于第二个 sheet,您用一把剪刀横向剪了两刀,一个正好在中间,一个在中间下方三厘米处。你丢弃顶部和底部的部分,只保留 3 厘米高的条带。这在概念上类似于对数据帧执行 df[df["A"]=="value"] 以仅 select 满足逻辑条件 df["A"]=="value".

的行

第 2 步:然后用剪刀垂直剪两刀,一个正好在中间,一个在第一个剪刀右侧一厘米处。您丢弃左右两块,只保留 1 厘米宽(和 3 厘米高)的矩形。这在概念上类似于从 DateFrame df[df["A"]=="value"] 开始(我们称此数据框为 Y),然后执行 Y["B"] 以获取 Y.[=24 中的列“B” =]

观察: 上面的思想实验表明,无论我们先垂直然后水平切割纸张,还是先水平切割然后垂直切割,在任何一种情况下,我们最终都会从完全相同的位置(水平和垂直)得到相同的矩形结果。

结论: 理解问题答案所需的直觉几乎完全类似于使用纸张的更具体的例子。一个细微的差别是 df[df["A"]=="value"] 编辑的 select 行可能不连续,因此它们不是类似于 3 厘米高的纸片,而是类似于多个平行的水平条带(即,多个连续行组)。