jupyter 读取数据库的数据,并和本地的excel表进行匹配

135 阅读4分钟

数据准备

MySQL 数据库中,text数据库的 个体户表数据如下:

image.png


本地 excel 文件 区划代码.xlsx 内容如下:

image.png


需求:连接数据库读取个体户表的数据,并跟 区划代码.xlsx 进行匹配,以个体户表处理地字段区划代码.xlsx街道编码字段为连接条件。 将街道匹配到个体户表中,并生成一张新的excel表。结果如下图所示:

注意:

1.这两个字段的名称不一样,需转化成一致。 2.个体户表的处理地的长度是12位,区划代码.xlsx的街道编码长度是9位,所以处理地需要截取前9位才能进行准确匹配。

image.png

代码

# 导入库
import mysql.connector
import pandas as pd

# 建立连接
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='xxx..',
    database='text'
)

# 创建游标对象
cursor = conn.cursor()

# 执行 SQL 语句
cursor.execute("SELECT 处理地, 个体经营户名称, 行业代码, 期末人数, 雇佣员工总支出, 全年与经营相关的总支出, 全年缴纳的各种税费, 全年的营业收入 FROM 个体户 WHERE 处理地 LIKE '330106%'")
# 获取所有查询结果
results = cursor.fetchall()

# 获取原表的列名的数组
columns = [i[0] for i in cursor.description]  # 获取列名
print(columns)
# 将结果转换为 DataFrame,注意使用columns参数指定列明,否则 DataFrame 的列名将会是默认的整数索引(0, 1, 2, ...)
df_个体户 = pd.DataFrame(results, columns=columns)

df_个体户 = df_个体户.rename(columns={"处理地" : "街道编码"})

# 截取处理地字段的前9位,并创建一个新列街道编码
df_个体户["街道编码"] = df_个体户["街道编码"].str.slice(0, 9)

# 读取区划代码.xlsx
df_区划代码 = pd.read_excel("/Users/xxx/Desktop/Temp/区划代码.xlsx", sheet_name="街道")

# 确保区划代码中的街道编码列是字符串类型
df_区划代码["街道编码"] = df_区划代码["街道编码"].astype(str)

# 合并数据框
df_result = df_个体户.merge(df_区划代码[["街道编码", "街道"]], on="街道编码", how="left")

# 保存到 Excel 文件
df_result.to_excel('/Users/xxx/Desktop/sole_data.xlsx', index=False)

# 关闭游标和连接
cursor.close()
conn.close()

代码片段解析

这段代码的主要目的是从一个MySQL数据库中提取数据,将其与一个Excel文件中的数据进行合并,并将合并后的数据保存到一个新的Excel文件中。下面是代码的详细解析:

  1. 导入库

    import mysql.connector
    import pandas as pd
    

    这两行代码导入了mysql.connector库用于连接MySQL数据库,以及pandas库用于数据处理。

  2. 建立连接

    conn = mysql.connector.connect(
        host='localhost',
        user='root',
        password='xxx..',
        database='text'
    )
    

    使用mysql.connector.connect方法建立与MySQL数据库的连接。这里指定了数据库服务器的主机名(localhost),用户名(root),密码(xxx..),以及要连接的数据库(text)。

  3. 创建游标对象

    cursor = conn.cursor()
    

    创建一个游标对象,用于执行SQL语句。

  4. 执行 SQL 语句

    cursor.execute("SELECT 处理地, 个体经营户名称, 行业代码, 期末人数, 雇佣员工总支出, 全年与经营相关的总支出, 全年缴纳的各种税费, 全年的营业收入 FROM 个体户 WHERE 处理地 LIKE '330106%'")
    

    执行一个SQL查询,从个体户表中选择特定字段,并且只选择处理地字段以330106开头的记录。

  5. 获取所有查询结果

    results = cursor.fetchall()
    

    使用fetchall方法获取查询结果。

  6. 获取原表的列名的数组

    columns = [i[0] for i in cursor.description]
    print(columns)
    

    从游标对象的description属性中获取列名,并打印出来。

  7. 将结果转换为 DataFrame

    df_个体户 = pd.DataFrame(results, columns=columns)
    

    将查询结果转换为pandas的DataFrame对象,使用获取到的列名作为DataFrame的列名。

  8. 重命名列

    df_个体户 = df_个体户.rename(columns={"处理地" : "街道编码"})
    

    将DataFrame中的处理地列重命名为街道编码

  9. 截取处理地字段的前9位

    df_个体户["街道编码"] = df_个体户["街道编码"].str.slice(0, 9)
    

    这行代码似乎有误,因为处理地已经被重命名为街道编码,所以应该直接使用df_个体户["街道编码"]

  10. 读取区划代码.xlsx

    python
    df_区划代码 = pd.read_excel("/Users/xxx/Desktop/Temp/区划代码.xlsx", sheet_name="街道")
    

    从指定路径读取Excel文件,并加载名为“街道”的工作表。

  11. 确保区划代码中的街道编码列是字符串类型

    df_区划代码["街道编码"] = df_区划代码["街道编码"].astype(str)
    

    确保街道编码列的数据类型为字符串。

  12. 合并数据框

    df_result = df_个体户.merge(df_区划代码[["街道编码", "街道"]], on="街道编码", how="left")
    

    使用merge方法将df_个体户df_区划代码根据街道编码列进行左连接。

  13. 保存到 Excel 文件

    df_result.to_excel('/Users/xxx/Desktop/sole_data.xlsx', index=False)
    

    将合并后的DataFrame保存到Excel文件中,不包含索引列。

  14. 关闭游标和连接

    cursor.close()
    conn.close()
    

    关闭游标和数据库连接,释放资源。