数据准备
MySQL 数据库中,text数据库的 个体户表数据如下:
本地 excel 文件 区划代码.xlsx 内容如下:
需求:连接数据库读取个体户表的数据,并跟 区划代码.xlsx 进行匹配,以个体户表的处理地字段 和 区划代码.xlsx的街道编码字段为连接条件。 将街道匹配到个体户表中,并生成一张新的excel表。结果如下图所示:
注意:
1.这两个字段的名称不一样,需转化成一致。 2.个体户表的处理地的长度是12位,区划代码.xlsx的街道编码长度是9位,所以处理地需要截取前9位才能进行准确匹配。
代码
# 导入库
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文件中。下面是代码的详细解析:
-
导入库:
import mysql.connector import pandas as pd这两行代码导入了
mysql.connector库用于连接MySQL数据库,以及pandas库用于数据处理。 -
建立连接:
conn = mysql.connector.connect( host='localhost', user='root', password='xxx..', database='text' )使用
mysql.connector.connect方法建立与MySQL数据库的连接。这里指定了数据库服务器的主机名(localhost),用户名(root),密码(xxx..),以及要连接的数据库(text)。 -
创建游标对象:
cursor = conn.cursor()创建一个游标对象,用于执行SQL语句。
-
执行 SQL 语句:
cursor.execute("SELECT 处理地, 个体经营户名称, 行业代码, 期末人数, 雇佣员工总支出, 全年与经营相关的总支出, 全年缴纳的各种税费, 全年的营业收入 FROM 个体户 WHERE 处理地 LIKE '330106%'")执行一个SQL查询,从
个体户表中选择特定字段,并且只选择处理地字段以330106开头的记录。 -
获取所有查询结果:
results = cursor.fetchall()使用
fetchall方法获取查询结果。 -
获取原表的列名的数组:
columns = [i[0] for i in cursor.description] print(columns)从游标对象的
description属性中获取列名,并打印出来。 -
将结果转换为 DataFrame:
df_个体户 = pd.DataFrame(results, columns=columns)将查询结果转换为pandas的DataFrame对象,使用获取到的列名作为DataFrame的列名。
-
重命名列:
df_个体户 = df_个体户.rename(columns={"处理地" : "街道编码"})将DataFrame中的
处理地列重命名为街道编码。 -
截取处理地字段的前9位:
df_个体户["街道编码"] = df_个体户["街道编码"].str.slice(0, 9)这行代码似乎有误,因为
处理地已经被重命名为街道编码,所以应该直接使用df_个体户["街道编码"]。 -
读取区划代码.xlsx:
python df_区划代码 = pd.read_excel("/Users/xxx/Desktop/Temp/区划代码.xlsx", sheet_name="街道")从指定路径读取Excel文件,并加载名为“街道”的工作表。
-
确保区划代码中的街道编码列是字符串类型:
df_区划代码["街道编码"] = df_区划代码["街道编码"].astype(str)确保
街道编码列的数据类型为字符串。 -
合并数据框:
df_result = df_个体户.merge(df_区划代码[["街道编码", "街道"]], on="街道编码", how="left")使用
merge方法将df_个体户和df_区划代码根据街道编码列进行左连接。 -
保存到 Excel 文件:
df_result.to_excel('/Users/xxx/Desktop/sole_data.xlsx', index=False)将合并后的DataFrame保存到Excel文件中,不包含索引列。
-
关闭游标和连接:
cursor.close() conn.close()关闭游标和数据库连接,释放资源。