前言

在 pandas 中,rainfall < 400 和 rainfall[rainfall < 400] 是数据筛选的两个核心步骤,前者生成布尔掩码(判断矩阵),后者基于该掩码实现数据筛选取值,二者是依赖关系(后者必须基于前者才能生效),核心区别和使用逻辑如下,结合之前的降雨量 DataFrame 实例讲解更易理解。
先明确示例基础(基于推荐的 2 行 3 列 DataFrame)
先复用修正后的可运行代码,确定基础数据结构,后续所有分析基于此:

import pandas as pd
rainfall = pd.DataFrame(
    data={
        "City 1": [300.1, 100.2],
        "City 2": [400.3, 300.4],
        "City 3": [1000.5, 1100.6]
    }
)
print(rainfall)
# 基础数据:2行(行索引0/1)、3列(City1/City2/City3)
#    City 1  City 2   City 3
# 0   300.1   400.3   1000.5
# 1   100.2   300.4   1100.6

一、rainfall < 400:生成布尔掩码(Boolean Mask)

核心作用
对 DataFrame 中的每一个元素逐一进行「是否小于 400」的判断,返回一个和原 DataFrame 行列结构完全一致的新 DataFrame,其中每个位置的值只有 True(满足条件:<400)或 False(不满足条件:≥400)—— 这个新的布尔型 DataFrame 就是布尔掩码,仅用于「条件判断」,不直接返回原数据。

print(rainfall < 400)
# 行列和原数据完全一致,仅存True/False
#    City 1  City 2  City 3
# 0    True   False   False
# 1    True    True   False

关键特性

  1. 结构一致:行数、列数、索引 / 列名和原 DataFrame 完全相同,一一对应;
  2. 类型为布尔:所有值都是 bool 类型,无原数据的数值;
  3. 仅做判断:不筛选、不提取原数据,仅标记「哪些位置满足条件」。

二、rainfall[rainfall < 400]:基于布尔掩码筛选并提取原数据

核心作用
将 rainfall < 400 生成的布尔掩码作为行 / 列筛选条件传入原 DataFrame 的中括号 [],实现:
对原 DataFrame 中每一个位置,若掩码对应位置为 True:保留原数据的数值;
若掩码对应位置为 False:用 NaN(非数值)填充,代表该位置不满足条件。
最终返回一个和原 DataFrame 行列结构仍一致的新 DataFrame,其中「满足条件的位置保留原数值,不满足的位置为 NaN」—— 这是 pandas 中按条件筛选元素的标准用法。

print(rainfall[rainfall < 400])
# 行列结构不变,满足条件保留原值,不满足为NaN
#    City 1  City 2  City 3
# 0   300.1     NaN     NaN
# 1   100.2   300.4     NaN

关键特性

结构不变:行数、列数、索引 / 列名仍和原 DataFrame 一致;
保留原数值:满足条件的位置直接提取原数据的数值,类型不变;
不满足填 NaN:NaN 是 pandas 中缺失值的标准表示,方便后续缺失值处理(如删除、填充);
依赖掩码:中括号内必须是和原 DataFrame 行列结构一致的布尔掩码,否则会报错。

三、核心区别总结(表格对比,一目了然)

表达式 核心类型 行列结构 存储值类型 核心作用 结果示例(City2 列)
rainfall < 400 布尔型 DataFrame 和原数据一致 True/False 生成条件判断掩码 [False, True]
rainfall[rainfall < 400] 数值型 DataFrame(含 NaN) 和原数据一致 原数值 / NaN 基于掩码筛选提取原数据 [NaN, 300.4]

四、拓展:如何提取「仅满足条件的纯数值(无 NaN、无结构)」?

如果需要只获取所有 < 400 的数值,不保留原行列结构、不含 NaN,可在掩码筛选后加 .dropna()(删除缺失值)或 .stack()(堆叠为一维),常用写法:

# 提取所有满足条件的数值,返回一维Series
valid_rain = rainfall[rainfall < 400].stack()
print(valid_rain)
# 输出:仅保留满足条件的原值,带原索引
# 0  City 1    300.1
# 1  City 1    100.2
#    City 2    300.4
# dtype: float64

# 进一步转为纯列表
valid_rain_list = valid_rain.tolist()
print(valid_rain_list)  # [300.1, 100.2, 300.4]

五、记忆口诀

先判断,后筛选;掩码是前提,取值靠中括号。
rainfall < 400 → 逐个判断打标签(True/False)
rainfall[掩码] → 按标签取值(留原值/填NaN)

最终总结

  1. rainfall < 400 是条件判断步骤,生成和原数据同结构的布尔掩码,仅标记满足条件的位置,无原数值;
  2. rainfall[rainfall < 400] 是数据提取步骤,基于前一步的布尔掩码,从原数据中筛选提取满足条件的数值,不满足的位置填 NaN,保留原行列结构;
  3. 二者是先后依赖关系,后者必须以前者生成的布尔掩码为条件,是 pandas 按元素条件筛选的核心组合用法;
  4. 若需纯满足条件的数值,可在筛选后用 .stack()/.dropna() 进一步处理,去除 NaN 和原结构。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐