一周学会Pandas2 Python数据处理与分析-Pandas2复杂数据查询操作
锋哥原创的Pandas2 Python数据处理与分析 视频教程:
2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili
前面我们学了.loc[]等几个简单的数据筛选操作,但实际业务需求往 往需要按照一定的条件甚至复杂的组合条件来查询数据。
逻辑运算操作
类似于Python的逻辑运算,我们以DataFrame其中一列进行逻辑计算,会产生一个对应的由布尔值组成的Series,真假值由此位上的数据是否满足逻辑表达式决定。
我们看一个最简单示例,查看语文是否及格:
df.set_index('姓名').语文分数 >= 60
同样支持多列判断,查看语文,数据,英语是否及格:
df.set_index('姓名').loc[:, ['语文分数', '数学分数', '英语分数']] >= 60
同时还支持组合条件的逻辑运算,我们来查下数学及格的男生。
~(df.数学分数 < 60) & (df['性别'] == '男')
逻辑筛选数据操作
前面我们逻辑运算返回的是布尔类型的Series结果集,我们现在可以通过切片[],.loc()方法来返回逻辑筛选结果。
我们看几个切片[]实例:
df[df['语文分数'] >= 60] # 查询语文及格的人
df[~(df['语文分数'] >= 60)] #查询语文不及格的人
df[df.语文分数 > df.数学分数] # 查询语文分数高于数学分数的人
我们在几个.loc[]实例:
df.loc[df['语文分数'] >= 60, '语文分数'] # 查询语文及格的人,只显示索引名称和语文分数列
df.loc[(df.语文分数 >= 60) & (df.数学分数 >= 60) & (df.英语分数 >= 60)] # 语数英都及格的人
df.loc[(df.语文分数 >= 90) | (df.数学分数 >= 90) | (df.英语分数 >= 90)] # 语数英至少有一个90分的人
df.loc[df.语文分数 == 100] # 语文满分的人
需要注意的是在进行或(|)、与(&)、非(~)运算时,各个独 立逻辑表达式需要用括号括起来。
pandas提供了一些比较函数来支持逻辑运算:
df.ne() # 不等于 !=
df.le() # 小于等于 <=
df.lt() # 小于 <
df.ge() # 大于等于 >=
df.gt() # 大于 >
参考示例:
df.loc[df.语文分数.eq(100)] # 语文满分的人
df.loc[(df.语文分数.ge(60)) & (df.数学分数.ge(60)) & (df.英语分数.ge(60))] # 语数英都及格的人
查询函数query()操作
pandas
的 query()
方法是一种高效且简洁的 DataFrame 数据过滤工具,允许通过字符串表达式筛选满足条件的行。它的语法类似于 SQL 的 WHERE
子句,特别适合复杂查询和动态条件处理。
基本语法
DataFrame.query(expr, inplace=False, **kwargs)
-
expr:字符串形式的查询条件表达式(支持列名、运算符、逻辑条件等)。
-
inplace:是否直接修改原 DataFrame(默认为
False
,返回新 DataFrame)。 -
**kwargs:其他参数(如
engine='python'
或parser='pandas'
)。
核心特性
-
简洁性:无需重复写 DataFrame 名称,直接使用列名操作。
-
动态表达式:支持字符串插值(如
@variable
引用外部变量)。 -
性能优化:底层依赖
numexpr
库,对大数据集查询效率更高。 -
复杂条件支持:灵活组合多条件(
and
/or
/not
)。
我们来看下示例:
df.query('数学分数>90') # 数学分数大于90的人
df.query('数学分数+语文分数+英语分数>250') # 总分大于250的人
df.query('(语文分数>90)&(性别=="男")') # 语文分数90分以上的男生
df.query('(语文分数>90)and(性别=="男")') # 语文分数90分以上的男生
还支持使用@符号引入变量,看下下面示例:
avg = df.语文分数.mean() # 求平均分
df.query('语文分数>@avg') # 语文分数超过平均分的人
df.query('语文分数>@avg+30') # 语文分数超过平均分30分的人
筛选函数filter()操作
pandas
的 filter()
方法用于根据行或列的标签名称筛选数据,支持按列名或行名匹配规则快速过滤。它不依赖数据内容,而是基于标签的规则匹配,适合处理列名或索引有特定规律的场景。
基本语法
DataFrame.filter(items=None, # 直接指定列名/行名列表like=None, # 模糊匹配包含指定字符串的标签regex=None, # 正则表达式匹配标签axis=None # 筛选方向:0(行)或 1(列,默认)
)
核心参数详解:
-
items:精确匹配列名或行名
-
like:模糊匹配包含字符串的标签
-
regex:正则表达式匹配标签
-
axis:指定筛选方向
具体示例:
df.filter(items=['语文分数', '数学分数']) # 选择列
df.filter(like='分数') # 列名包含分数的列
df.filter(regex='孙', axis=0) # 所有孙姓数据