python中pandas模块(merge方法)实现SQL Server中的表关联join

本文通过SQL Server中的表关联及Python的pandas库演示了如何整合不同数据表中的信息,实现了学生、课程与成绩数据的有效关联。

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

python连接sql server的方法,可以参考这篇文章:python连接SQL Server:Pymssql模块

基于下面的数据,分别用sql 和 python,实现数据集的关联,得到 学生、课程、成绩 的数据。

建表

--学生 
CREATE TABLE student    
(    
      sid INT ,    
      sname NVARCHAR(32) ,    
      sage INT ,    
      ssex NVARCHAR(8)    
 )     
    
 --课程表    
CREATE TABLE course    
(    
      cid INT ,    
      cname NVARCHAR(32) ,    
      tid INT    
)     
    
--成绩表    
CREATE TABLE sc ( s# INT, c# INT, score INT )     
    
CREATE TABLE teacher    
(    
      tid INT ,    
      tname NVARCHAR(16)    
)     
    
 insert into Student select 1,N'刘一',18,N'男' union all    
 select 2,N'钱二',19,N'女' union all    
 select 3,N'张三',17,N'男' union all    
 select 4,N'李四',18,N'女' union all    
 select 5,N'王五',17,N'男' union all    
 select 6,N'赵六',19,N'女'     
     
 insert into Teacher     
 select 1,N'叶平' union all    
 select 2,N'贺高' union all    
 select 3,N'杨艳' union all    
 select 4,N'周磊'    
     
 insert into Course     
 select 1,N'语文',1 union all    
 select 2,N'数学',2 union all    
 select 3,N'英语',3 union all    
 select 4,N'物理',4    
     
 insert into SC     
 select 1,1,56 union all     
 select 1,2,78 union all     
 select 1,3,67 union all     
 select 1,4,58 union all     
 select 2,1,79 union all     
 select 2,2,81 union all     
 select 2,3,92 union all     
 select 2,4,68 union all     
 select 3,1,91 union all     
 select 3,2,47 union all     
 select 3,3,88 union all     
 select 3,4,56 union all     
 select 4,2,88 union all     
 select 4,3,90 union all     
 select 4,4,93 union all     
 select 5,1,46 union all     
 select 5,3,78 union all     
 select 5,4,53 union all     
 select 6,1,35 union all     
 select 6,2,68 union all     
 select 6,4,71    

一、SQL Server中的表关联 join

用sql来实现,非常简单,直接用join把3个表关联起来就可以了:

 SELECT s.sname,
        c.cname,
		sc.score
 FROM sc 
 INNER JOIN student s
 ON sc.sid = s.sid
 INNER JOIN course c
 ON sc.cid = c.cid

二、python中的集合关联

# -*- coding:gbk -*-

import pymssql as pm
from pandas import DataFrame #行列结构
import pandas as pd

conn = pm.connect(host='localhost',user='sa',password='momogua',database='test')

cur = conn.cursor()

#获取sc表的数据,格式化
cur.execute('select * from sc')
sc = cur.fetchall()
dsc = DataFrame(sc,columns = ['sid','cid','score'])

#获取student表的数据,格式化
cur.execute('select sid,sname from student')
student = cur.fetchall()
dstudent = DataFrame(student,columns=['sid','sname'])

#获取course表的数据,格式化
cur.execute('select cid,cname from course')
course = cur.fetchall()
dcourse = DataFrame(course,columns=['cid','cname'])

#print dsc
#print dstudent
#print dcourse

#合并sc表与student表
sc_student = pd.merge(dsc,dstudent, left_on='sid',right_on='sid',how='inner')

#在把合并的结果,和course表合并
sc_student_course = pd.merge(sc_student,dcourse,left_on='cid',right_on='cid',how='inner')

#取sname,cname,score 3列
r = sc_student_course[['sname','cname','score']]

print r

输出结果:

>>> ================================ RESTART ================================
>>> 
   sname cname  score
0     刘一    语文     56
1     钱二    语文     79
2     张三    语文     91
3     王五    语文     46
4     赵六    语文     35
5     刘一    数学     78
6     钱二    数学     81
7     张三    数学     47
8     李四    数学     88
9     赵六    数学     68
10    刘一    英语     67
11    钱二    英语     92
12    张三    英语     88
13    李四    英语     90
14    王五    英语     78
15    刘一    物理     58
16    钱二    物理     68
17    张三    物理     56
18    李四    物理     93
19    王五    物理     53
20    赵六    物理     71

### Python Pandas 中 `merge` 函数使用指南 #### 1. `merge` 函数简介 `merge` 是 Pandas 库中用于合并 DataFrame 的重要函数。它允许用户通过指定的键将两个或多个数据集进行关联和匹配,从而实现类似 SQL 中的 JOIN 操作[^1]。 #### 2. 基本语法 `merge` 函数的基本语法如下: ```python pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), indicator=False, validate=None) ``` - **`left` 和 `right`**:示需要合并的两个 DataFrame。 - **`how`**:指定合并的方式,可选值为 `'inner'`、`'outer'`、`'left'` 和 `'right'`[^2]。 - **`on`**:指定用于合并的列名或索引名称。如果未指定,则会尝试自动匹配重叠的列名。 - **`left_on` 和 `right_on`**:分别指定左和右中的键列。 - **`left_index` 和 `right_index`**:是否使用索引作为合并键。 - **`suffixes`**:当存在重复列名时,用于区分左右的后缀。 - **`indicator`**:是否添加一列来标识每行数据的来源。 #### 3. 合并方式详解 `merge` 函数支持四种主要的合并方式,由参数 `how` 控制: - **`inner`**:内连接,只保留两个 DataFrame 中都存在的键。 - **`outer`**:外连接,保留所有键,并用 NaN 填充缺失值。 - **`left`**:左连接,保留左的所有键,并用 NaN 填充右中不存在的键。 - **`right`**:右连接,保留右的所有键,并用 NaN 填充左中不存在的键。 #### 4. 示例代码 ##### 示例 1:基本合并 ```python import pandas as pd # 创建两个示例 DataFrame df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value1': [1, 2, 3, 4]}) df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value2': [5, 6, 7, 8]}) # 内连接 merged_inner = pd.merge(df1, df2, on='key', how='inner') print("内连接结果:") print(merged_inner) # 左连接 merged_left = pd.merge(df1, df2, on='key', how='left') print("\n左连接结果:") print(merged_left) ``` ##### 示例 2:多键合并 ```python # 创建两个示例 DataFrame df_d = pd.DataFrame({'部门': ['销售部', '技术部', '市场部'], '人数': [10, 20, 15]}) df_e = pd.DataFrame({'部门': ['销售部', '技术部'], '预算': [10000, 20000]}) # 使用多键合并 merged_multi = pd.merge(df_d, df_e, on='部门', how='left', indicator=True) print("\n多键合并结果:") print(merged_multi) ``` ##### 示例 3:类似 Excel 的 VLOOKUP ```python # 创建两个示例 DataFrame data1 = pd.DataFrame({'姓名': ['张三', '李四', '王五'], '年龄': [25, 30, 35]}) data2 = pd.DataFrame({'姓名': ['张三', '李四'], '子女姓名': ['小明', '小红']}) # 实现类似 VLOOKUP 的效果 data3 = pd.merge(data1, data2, how="left", on=["姓名"]) print("\nVLOOKUP 效果:") print(data3) ``` #### 5. 特殊用法 - **索引合并**:可以通过设置 `left_index=True` 或 `right_index=True` 使用索引作为合并键。 - **后缀处理**:当左右中存在同名列时,可以使用 `suffixes` 参数避免冲突。 - **指示列**:通过设置 `indicator=True`,可以生成一列来标识每行数据的来源。 #### 6. 性能优化 在处理大规模数据集时,可以通过以下方法优化 `merge` 的性能: - 尽量减少参与合并的数据量。 - 使用更高效的键类型(如整数型而非字符串型)。 - 预先对数据进行排序以加快查找速度。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值