pandas+mySQL

本文介绍了如何使用Python的pandas库配合SQLAlchemy进行数据操作,包括将DataFrame写入MySQL数据库,以及读取和筛选特定条件的数据。作者提供了详细步骤,如创建数据库连接、定义数据模型、执行SQL查询等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录我的pandas 配件 mySQL 处理数据的一些笔记

1、dataframe 写入 mysql

1、将sales数据写入mysql

def W_SQL_sanho_sales_V2024(df):
    import pandas as pd
    from sqlalchemy import create_engine, Column, Integer, String, DateTime, Float, BigInteger
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker
    from datetime import datetime
    # 2024年的价格明细表
    # 初始化数据库连接(按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名、格式)
    engine = create_engine("mysql+pymysql://root:XXXXXXX@localhost:3306/" +
                            "sanho" + "?charset=utf8")

    # 创建会话工厂,使用sessionmaker()函数绑定了数据库引擎。
    Session = sessionmaker(bind=engine)

    # 创建基类Base,它是SQLAlchemy的基础类。
    Base = declarative_base()

    # 定义数据模型
    # ['成品编码','销售渠道', '销售区域', '经销商', '产品定位', '生命周期', '属性', '成本', '单价', '销量', '销售额', '成本额', '月', '年']
    class sanho_sales_V2024(Base):
        __tablename__ = 'sanho_sales_V2024'
        id = Column(Integer, primary_key=True)
        P_code = Column(BigInteger) # "成品编码"
        channel = Column(String(30)) # "渠道"
        sales_area = Column(String(30)) # "销售区域"
        customs = Column(String(255)) # "客户名称"
        P_position = Column(String(20)) # "产品定位"
        lifecycle = Column(String(20)) # "生命周期"
        P_attribute = Column(String(10)) # "属性"
        P_cost = Column(Float) # "成本"
        P_price = Column(Float) # "单价"
        sales_volume = Column(Float) # "销量"
        saleroom = Column(Float) # "销售额"
        total_cost = Column(Float) # "成本额"
        P_month = Column(String(4)) # "月"
        P_year = Column(String(6)) # "年"
        # default=datetime.now来设置默认值为当前时间戳。
        timestamp = Column(DateTime, default=datetime.now)

    # 创建数据表,使用Base.metadata.create_all(engine)创建数据表。
    Base.metadata.create_all(engine)

    # 创建会话
    session = Session()

    # 将DataFrame数据写入数据库
    # 使用df.iterrows()遍历DataFrame中的每一行数据。在循环中,我们创建了一个数据对象data_obj,并将其添加到会话中。
    for index, row in df.iterrows():
        # print(row)
        data_obj = sanho_sales_V2024(
                                    P_code=row['成品编码'],
                                    channel=row['渠道'],
                                    sales_area = row['销售区域'],
                                    customs=row['客户名称'],
                                    P_position=row['产品定位'],
                                    lifecycle=row['生命周期'],
                                    P_attribute=row['属性'],
                                    P_cost=row['成本'],
                                    P_price=row['单价'],
                                    sales_volume=row['销量'],
                                    saleroom=row['销售额'],
                                    total_cost=row['成本额'],
                                    P_month=row['月'],
                                    P_year=row['年'],                    
                                )
        session.add(data_obj)

    # 提交事务
    session.commit()

    # 关闭会话
    session.close()

2、读取mysql所有数据

%%time
from sqlalchemy import create_engine, MetaData, Table
import pandas as pd

# 初始化数据库连接(按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名、格式)
engine = create_engine("mysql+pymysql://root:XXXXXX@localhost:3306/" +
                               "sanho" + "?charset=utf8")

# 创建元数据对象
metadata = MetaData(bind=engine)

# 获取数据表对象
table = Table('sanho_sales_V2024', metadata, autoload=True)

# 创建查询语句
select_stmt = table.select()

# 执行查询操作并将结果转换为DataFrame
df = pd.read_sql(select_stmt, engine)

df.info()

3、读取符合条件的mysql数据

以下是 读取'sanho_sales_V2024'表中, 'P_year'列的值等于['2023年', '2024年']的所有数据

def read_SQL_V2024(SQLtable_name,SQLcolumn_name,SQLvalues):
    from sqlalchemy import create_engine, select, MetaData, Table
    import pandas as pd
    
    # 初始化数据库连接(按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名、格式)
    engine = create_engine("mysql+pymysql://root:XXXXX@localhost:3306/" +
                               "sanho" + "?charset=utf8")
    
    # 创建元数据对象
    metadata = MetaData(bind=engine)
    
    # 定义表名、列名和多个特定值
    table_name = SQLtable_name
    column_name = SQLcolumn_name
    values = SQLvalues
    
    # 获取表对象
    table = Table(table_name, metadata, autoload=True)
    
    # 构建查询语句
    stmt = select([table]).where(table.columns[column_name].in_(values))
    
    # 执行查询并获取结果
    result = engine.execute(stmt).fetchall()
    
    # 将结果转换为DataFrame
    df = pd.DataFrame(result, columns=result[0].keys())
    
    return df


# 读取'sanho_sales_V2024'表中, 'P_year'列的值等于['2023年', '2024年']的所有数据
SQLtable_name = 'sanho_sales_V2024'
SQLcolumn_name = 'P_year'
SQLvalues = ['2023年', '2024年']

df_sales_0 = read_SQL_V2024(SQLtable_name,SQLcolumn_name,SQLvalues)

4、删除符合条件的mysql数据

%%time
# del some data from mysql

from sqlalchemy import create_engine, MetaData, Table, delete

# 初始化数据库连接(按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名、格式)
engine = create_engine("mysql+pymysql://root:XXXXX@localhost:3306/" +
                               "sanho" + "?charset=utf8")

# 创建元数据对象
metadata = MetaData(bind=engine)

# 获取数据表对象
table = Table('sanho_sales_V2024', metadata, autoload=True)

# 指定要删除的列和值列表
# 删除'P_year'列中所有['2024年']行的数据
column_name = 'P_year'
values_to_delete = ['2024年']

# 创建删除语句
delete_stmt = delete(table).where(table.c[column_name].in_(values_to_delete))

# 执行删除操作
with engine.begin() as conn:
    conn.execute(delete_stmt)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值