记录一个pandas执行模糊查询sql的坑

本文介绍在使用Presto查询引擎时,如何正确进行模糊查询。通过调整SQL语句中的like子句,解决了因字符匹配错误导致的问题,确保了查询结果的准确性。
查询引擎使用了presto,在sql中使用了模糊查询。
engine = create_engine(presto_url,encoding='utf-8')

sql_exe ="""select id,title,tags from source.base.table where  tags like '%呵呵%' """
df = pd.read_sql_query(sql_exe,engine)

一直报错:unsupported format character

解决方案

1 sql_exe ="""select id,title,tags from source.base.table where tags like '%%呵呵%%' """

 

2 sql_exe ="""select id,title,tags from source.base.table where tags like %s """

  df = pd.read_sql_query(sql_exe,engine,params=("%呵呵%",))

<think>嗯,用户问的是如何使用Python的Pandas执行数据查询操作。首先,我需要回忆Pandas中常用的数据查询方法。记得Pandas主要有两种数据结构,DataFrame和Series,而查询操作通常是在DataFrame上进行的。 首先,用户可能需要基本的查询方式,比如布尔索引。比如通过条件筛选数据,例如df[df['age'] > 30],这样可以筛选出年龄大于30的行。这个是最基础也是最常用的方法,应该放在前面介绍。 然后是.loc和.iloc方法。.loc是基于标签的索引,可以同时指定行和列的条件,而.iloc是基于位置的索引,适合按位置选择数据。可能需要分别举例说明,比如用.loc选择特定行和列,或者结合条件查询。 接下来,用户可能需要进行字符串的模糊查询,比如使用str.contains方法。例如,筛选出名字中包含“John”的行。这时候需要提到Pandas的字符串方法,并且提醒注意大小写敏感的问题,可能还需要提到case参数的使用。 另外,isin方法也是常用的,用于筛选某列的数值是否在某个列表中。比如df[df['city'].isin(['Beijing', 'Shanghai'])],这样可以选出城市是北京或上海的数据。这个在处理分类数据时非常有用。 还有query方法,这个可能更高级一些,允许使用字符串表达式进行查询,类似于SQL的WHERE子句。比如df.query("age > 30 and city == 'Shanghai'"),这样的写法更简洁,适合熟悉SQL的用户。不过需要说明的是,query方法的性能可能在大数据量时不如布尔索引,但代码可读性更好。 用户可能还关心如何执行SQL查询,比如直接从数据库读取数据或者对DataFrame执行SQL语句。这时候需要提到read_sql_query函数,以及结合SQLAlchemy引擎的使用。例如,使用pd.read_sql_query("SELECT * FROM table WHERE age > 30", engine)来从数据库获取数据。同时,保存DataFrame到数据库可以用to_sql方法,这也是常见操作。 参数化查询是为了防止SQL注入,这时候需要提到使用参数化查询的方式,比如在read_sql_query中使用params参数传递变量,而不是拼接字符串。这样可以提高安全性,特别是在处理用户输入的时候。 在注意事项方面,性能优化很重要。对于大数据集,应该建议使用向量化操作,避免循环。此外,索引的合理使用也能提升查询速度,比如对常用查询字段设置索引。同时,处理缺失值时需要注意,比如NaN的处理可能会影响查询结果。 用户提供的引用中提到了read_sql_query和to_sql的使用,以及SQLAlchemy的参数。所以需要确保在回答中涵盖这些点,特别是如何连接到数据库和执行查询。此外,引用中还提到国内镜像安装的问题,不过用户的问题是关于数据查询,可能不需要涉及安装部分,但如果有环境配置的问题,可能需要提到,但这里应该不需要。 可能用户的实际需求是从数据库查询数据并进行处理,或者对现有的DataFrame进行灵活的条件筛选。需要结合不同的方法,给出示例代码,让用户能够直接复制使用。同时,要注意代码的格式正确,比如使用反引号包裹代码块,并正确标注语言类型。 最后,生成的相关问题需要围绕Pandas的查询操作展开,比如如何组合多个条件,处理复杂查询,性能优化,或者如何将查询结果导出。这些问题应该能帮助用户进一步深入学习和解决问题。</think>以下是使用Python的Pandas执行数据查询的详细方法,结合代码示例说明: --- ### 一、基础数据查询方法 1. **布尔索引查询** 通过条件表达式生成布尔序列筛选数据: ```python # 筛选年龄大于30的记录 result = df[df['age'] > 30] # 多条件查询(注意用&/|替代and/or) filtered_data = df[(df['city'] == 'Shanghai') & (df['salary'] > 10000)] ``` 2. **`loc` 与 `iloc` 定位查询** - `loc` 按标签/条件筛选: ```python # 选择满足条件的行和特定列 selected = df.loc[df['score'] >= 90, ['name', 'subject']] ``` - `iloc` 按位置索引: ```python # 提取第2-5行、前3列数据 subset = df.iloc[1:5, 0:3] ``` --- ### 二、进阶查询技巧 3. **字符串模糊匹配** 使用`.str.contains()`进行文本筛选: ```python # 查找姓名包含"张"的记录(case=False忽略大小写) mask = df['name'].str.contains('张', case=False, na=False) zhangs = df[mask] ``` 4. **`isin()` 列表匹配** 筛选列值存在于指定集合中的数据: ```python # 筛选城市为北京或上海的数据 cities = ['Beijing', 'Shanghai'] city_data = df[df['city'].isin(cities)] ``` 5. **`query()` 方法** 支持SQL-like语法的高可读性查询: ```python # 直接编写表达式字符串 result = df.query("30 <= age <= 50 and department == 'Sales'") ``` --- ### 三、数据库交互查询 6. **从数据库读取数据** 使用`pd.read_sql_query`执行SQL语句(需配合SQLAlchemy引擎): ```python from sqlalchemy import create_engine engine = create_engine('sqlite:///mydatabase.db') # 执行SQL查询并返回DataFrame sql = "SELECT * FROM employees WHERE hire_date > '2020-01-01'" df = pd.read_sql_query(sql, engine) ``` 7. **参数化查询(防SQL注入)** 安全传递动态参数: ```python params = {'min_salary': 8000, 'target_dept': 'IT'} safe_query = "SELECT * FROM staff WHERE salary > %(min_salary)s AND department = %(target_dept)s" df = pd.read_sql_query(safe_query, engine, params=params) ``` 8. **DataFrame写入数据库** 使用`to_sql`保存查询结果: ```python df.to_sql('new_table', engine, if_exists='replace', index=False) ``` --- ### 四、性能优化建议 - 对常用筛选字段**预先设置索引**:`df.set_index('user_id', inplace=True)` - 处理超大数据时使用`dask`库并行处理 - 避免逐行循环操作,优先使用向量化方法 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值