python pandas 对mysql 一些常见操作

使用 Python 的 pandas 库与 MySQL 数据库进行交互是非常常见的任务。pandas 提供了一个非常方便的方法 read_sql() 和 to_sql(),能够直接读取和写入 MySQL 数据。结合 SQLAlchemy 或 pymysql 作为 MySQL 的连接器,可以轻松实现数据的传输。

常见操作:

1. 连接到 MySQL 数据库

首先,你需要使用 SQLAlchemy 或 pymysql 来建立与 MySQL 的连接。

bash 复制代码
pip install sqlalchemy pymysql pandas

然后使用下面的代码来建立连接:

python 复制代码
from sqlalchemy import create_engine
import pandas as pd

# 使用 SQLAlchemy 的 create_engine 创建连接
engine = create_engine('mysql+pymysql://username:password@host:port/database_name')

# 或者直接使用 pymysql 连接
import pymysql
connection = pymysql.connect(host='host', user='username', password='password', database='database_name', port=3306)
2. 读取 MySQL 数据到 pandas DataFrame

通过 pandas.read_sql() 方法,可以直接将 MySQL 查询结果加载到 DataFrame 中:

python 复制代码
# 使用 SQLAlchemy engine
query = "SELECT * FROM table_name"
df = pd.read_sql(query, engine)

# 或者使用 pymysql connection
df = pd.read_sql(query, connection)
3. 写入 pandas DataFrame 到 MySQL

pandas 提供了 to_sql() 方法,可以将 DataFrame 中的数据写入 MySQL 表格中。

python 复制代码
# 将 DataFrame 写入 MySQL
df.to_sql('table_name', engine, if_exists='replace', index=False)

if_exists 参数有以下几种选项:

  • 'fail': 如果表已经存在,什么都不做。
  • 'replace': 如果表已经存在,删除旧表并创建新表。
  • 'append': 如果表已存在,将数据追加到现有表中。
4. 执行 SQL 查询操作

如果你只需要执行 SQL 语句而不关心结果(例如插入数据、更新数据),可以使用 engine.execute() 或 connection.cursor():

python 复制代码
# 执行 SQL 语句
with engine.connect() as connection:
    connection.execute("UPDATE table_name SET column_name = value WHERE condition")

或者使用 pymysql 的方式:

python 复制代码
cursor = connection.cursor()
cursor.execute("UPDATE table_name SET column_name = value WHERE condition")
connection.commit()  # 提交更改
5. 从 MySQL 读取数据并进行操作
python 复制代码
# 读取数据到 DataFrame
df = pd.read_sql("SELECT * FROM employees WHERE salary > 50000", engine)

# 进行 pandas 操作,如筛选、聚合等
df_filtered = df[df['age'] > 30]
6. 写入大数据(批量插入)

在处理大量数据时,使用 to_sql() 方法时可以通过设置 chunksize 来分批插入,避免内存溢出。

python 复制代码
# 分批插入数据
df.to_sql('table_name', engine, if_exists='append', index=False, chunksize=1000)
7. 读取大数据(使用分页)

当需要从 MySQL 中读取大量数据时,建议使用分页技术(通过 LIMIT 和 OFFSET)来分批读取,避免一次性加载过多数据导致内存问题。

python 复制代码
# 分页查询
offset = 0
batch_size = 1000
query = f"SELECT * FROM table_name LIMIT {batch_size} OFFSET {offset}"
df_batch = pd.read_sql(query, engine)
8. 查询结果按条件筛选
python 复制代码
# 使用 SQL 语句进行筛选
df = pd.read_sql("SELECT * FROM table_name WHERE column_name = 'value'", engine)

# 或者在 pandas 中进行条件筛选
df_filtered = df[df['column_name'] == 'value']

注意事项:

  1. 连接池 :对于高并发应用,建议使用连接池来管理数据库连接。SQLAlchemy 自带连接池,也可以配置。
  2. 事务控制 :对于需要多个 SQL 操作一起提交的场景,可以使用事务控制(BEGIN、COMMIT 和 ROLLBACK)。
  3. 性能 :对于非常大的数据集,可以使用 chunksize 进行分块读取或写入,避免一次性操作过多数据导致内存溢出。

这些基本操作和技巧可以帮助你在 Python 中使用 pandas 和 MySQL 高效地进行数据操作。

你学废了么?

相关推荐
smile_life_23 分钟前
MySQL 设置 防止账户被暴力破解
数据库·mysql
尹人入圣35 分钟前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
滕州市燕猫虎计算机科技工作室个体工商户1 小时前
MySQL、MVCC、多版本并发控制
数据库·mysql·mvcc·数据库事务
Nuanyt1 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
吴卫斌1 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
2601_967987372 小时前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数
Decay__3 小时前
09_MySQL 闪回与时间点恢复 —— binlog 回放、mysqlbinlog、PITR 与误删恢复
运维·数据库·sql·mysql·架构
太理摆烂哥3 小时前
MySQL用户管理
数据库·mysql
专注仿真4 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放4 小时前
Python基础语法练习题(75)
开发语言·python·学习