HOWTO · Pandas

Pandas Masking

本教程演示了如何在 Pandas 中创建 masking。

本页内容

pandas 的布尔掩码是根据一个或多个列的条件构建的布尔型 Series。其中的 True 和 False 值按索引与 DataFrame 的行对齐。使用 df[mask] 应用掩码后,会返回标记为 True 的行;掩码本身并不是筛选后的 DataFrame。

创建示例 DataFrame

这个小例子使用日期索引、数值列 value,以及 value2 中的 Alpha 或 Beta 类别。直接构建这些列可以避免按标签赋值时出现意外,并为两个筛选示例提供相同且可复现的输入。

运行以下示例:

本节中的代码以及显示的标签或输出仍为英文。

import pandas as pd

index = pd.date_range("2013-01-01", periods=6, freq="30min")
dates_data = pd.DataFrame(
    {
        "value": range(6),
        "value2": ["Beta", "Beta", "Beta", "Alpha", "Alpha", "Beta"],
    },
    index=index,
)

# A condition compares each row and returns one Boolean value per index.
beta_mask = dates_data["value2"] == "Beta"

# Use the Boolean Series to select matching rows.
beta_rows = dates_data[beta_mask]

# Combine conditions to select Beta rows whose value is greater than 3.
combined_mask = (dates_data["value2"] == "Beta") & (dates_data["value"] > 3)
combined_rows = dates_data[combined_mask]

print(beta_mask.tolist())
print(beta_rows)
print(combined_rows)

第一次比较会为每一行生成一个布尔掩码值。如果想检查或重复使用掩码,可以将它保存到变量中;将它应用于 dates_data 后,就能选出匹配的记录。

根据单个条件构建布尔掩码

条件 dates_data["value2"] == "Beta" 会将每一行的类别与字符串 "Beta" 进行比较。结果是一个索引与原始 DataFrame 相同的布尔型 Series。在这个例子中,掩码将第 0、1、2 和 5 行标记为 True;其他类别所在的行则为 False。

将掩码放在方括号中,例如 dates_data[beta_mask],即可只返回匹配的行。原始 DataFrame 仍然可用,返回的 DataFrame 会保留所选行的索引和列。如果不需要保存掩码,也可以直接在方括号中写比较条件:dates_data[dates_data["value2"] == "Beta"]。

在掩码中组合多个条件

若要同时满足两个条件,可用 &(逐元素与)组合它们各自的布尔 Series。示例会保留 value2 为 "Beta" 且 value 大于 3 的行。只有两个比较结果都为真时,某一行才会被选中。如果任一条件匹配即可,可使用 |(逐元素或);使用 ~ 可以反转布尔条件。

组合条件前,请为每个比较表达式加上括号。括号能明确表达预期的分组方式,并确保先计算各个比较,再应用逐元素运算符。例如,(dates_data["value2"] == "Beta") & (dates_data["value"] > 3) 会组合两个完整的掩码。对于 pandas Series 条件,请使用 & 和 |;Python 的 and 和 or 需要单个真值,不能像这样组合整个 Series。

使用掩码选择行

将组合后的掩码放入 DataFrame 的方括号中:dates_data[combined_mask]。这样会返回同时满足两个比较条件的行:类别为 Beta,且数值大于 3。单条件筛选会返回所有标记为 Beta 的行,其中也包括不满足数值条件的行。

处理其他任务时,可以替换列名、比较运算或值,同时沿用相同模式:先创建布尔掩码,再用它选择行。>=、!= 和成员资格检查等比较也可以构成掩码。如果条件涉及多个列,请确保每个比较结果的索引都与待筛选的 DataFrame 相同,这样 pandas 才能按行对齐这些值。

检查结果并避免常见错误

使用 beta_mask.tolist() 检查掩码,或直接打印它,就能查看哪些行被标记。也可以根据条件核对选出的行:combined_rows 返回的每一行都应满足 value2 等于 "Beta" 且 value 大于 3。示例代码会打印掩码和两个筛选后的 DataFrame,方便你将这些值与输入数据进行比较。

常见错误包括在 Series 之间使用 and 或 or、省略比较表达式周围的括号,以及把掩码误当成筛选后的表。请用带括号的比较表达式配合 & 或 |,再通过 df[mask] 应用生成的布尔 Series。需要清楚表达行筛选规则或在多个位置重复使用相同条件时,布尔掩码会很有帮助。