pandas.DataFrame中query和eval的用法

pandas.DataFrame的query与eval方法详解
本文介绍了pandas DataFrame中的query和eval方法,用于高效筛选和计算数据。query方法利用类似SQL的语法进行布尔表达式筛选,而eval方法则用于执行字符串表达式以实现快速计算。结合这两个方法,可以提升数据处理的效率和便利性。

在使用Python进行数据处理和分析时,pandas是一个十分强大且常用的工具。pandas提供了DataFrame这个数据结构,可以方便地进行数据操作和计算。在DataFrame中,query和eval这两个方法提供了一种更加高效和简洁的方式来筛选和计算数据。

首先,我们将介绍query方法。该方法允许我们通过布尔表达式来筛选DataFrame中的数据。query方法采用类似于SQL的语法,可以使用各种逻辑运算符(例如==、!=、>、<、>=、<=)以及与、或和非逻辑运算符(&、|、~)。

下面是一个示例,展示了如何使用query方法来筛选DataFrame中的数据:

import pandas as pd

# 创建一个示例DataFrame
data = {
   
   'name': ['Alice'
### 三级标题:pandas.query() 函数的使用方法 `pandas.query()` 是一种用于筛选 DataFrame 数据的强大工具,它允许通过字符串表达式对数据进行过滤。相比传统的布尔索引方式,`query()` 提供了更简洁、可读性更强的语法形式,并且在底层使用 `eval()` 函数对表达式进行求值,从而返回满足条件的子集 [^1]。 #### 基本语法与参数说明 `query()` 的基本调用格式如下: ```python df.query(expr, inplace=False, **kwargs) ``` - `expr`: 字符串类型的查询表达式,用于指定过滤条件。 - `inplace`: 是否在原数据上修改,默认为 `False`。 - `**kwargs`: 可选参数,用于控制表达式的解析环境,例如变量前缀等 [^2]。 #### 使用示例 ##### 单一条件过滤 可以使用简单的比较操作符进行过滤。例如,从一个包含数值列的 DataFrame 中筛选出 `value_1 > 5` 的记录: ```python import pandas as pd import numpy as np values_1 = np.random.randint(10, size=10) years = np.arange(2010, 2020) groups = ['A','A','B','A','B','B','C','A','C','C'] df = pd.DataFrame({'group': groups, 'year': years, 'value_1': values_1}) # 筛选出 value_1 大于 5 的行 filtered_df = df.query('value_1 > 5') print(filtered_df) ``` ##### 多条件组合过滤 使用逻辑运算符 `&`(与)、`|`(或) `~`(非)来构建复合条件。注意每个条件需要用括号包裹: ```python # 筛选出 group 为 'A' 且 year 大于 2015 的记录 result = df.query("group == 'A' & year > 2015") print(result) ``` ##### 使用外部变量 可以通过 `@` 符号引用外部定义的变量,实现动态查询。例如,筛选出 `c` 列不在某个列表中的行: ```python query_list = [1, 2] df_2 = df.query('c not in @query_list')[['a', 'b']] print(df_2) ``` ##### 时间序列或字符串字段的处理 对于字符串字段,可以直接使用 `'=='` 或 `'!='` 进行匹配;对于时间序列字段,也可以结合日期比较进行筛选: ```python # 筛选出 group 为 'B' 的记录 df.query("group == 'B'") ``` ##### 多层索引(MultiIndex)下的查询 如果 DataFrame 包含多层索引结构,也可以直接在 `query()` 中引用层级名称进行筛选: ```python from pandas import MultiIndex arrays = [ ['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'] ] index = MultiIndex.from_arrays(arrays, names=['first', 'second']) df_multi = pd.DataFrame(np.random.randn(8, 4), index=index, columns=['C1', 'C2', 'C3', 'C4']) # 查询 first 层为 'bar' 的所有记录 result = df_multi.query("first == 'bar'") print(result) ``` #### 注意事项 - 表达式中列名不能包含空格或特殊字符,若必须使用,则应确保其可用性或使用反引号(\`)包裹。 - 对于性能敏感的场景,`query()` 在大数据集上可能比向量化操作稍慢,但其代码可读性简洁性使其在多数情况下仍具优势 [^4]。 - 若需频繁执行复杂查询,建议结合 `numexpr` 引擎以提升性能。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值