楼主: zwy_0309
907 0

Python中数据表的连接 [推广有奖]

  • 1关注
  • 3粉丝

硕士生

36%

还不是VIP/贵宾

-

威望
0
论坛币
342 个
通用积分
128.8010
学术水平
11 点
热心指数
9 点
信用等级
7 点
经验
4173 点
帖子
69
精华
0
在线时间
150 小时
注册时间
2019-6-4
最后登录
2025-8-19

楼主
zwy_0309 在职认证  发表于 2020-8-27 10:43:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

在实际使用中,我们往往需要多张表一起连接才能使用,以下记录多表连接的方法:

一、学生表和分数表--自然连接

学生表和分数表建表如下(由于字数限制,我将脚本截图了):

11.png

【脚本】

print( pd.merge(student,scores,left_on='ID',right_on='SID') )

【结果】

   ID name  gender  age height SID  CID  Score

0  01   张三    True  20    1.88  01 A01     56

1  01   张三    True  20    1.88  01 A02     78

【说明】

1、 以上两表中,如果关联列的列名一样,假设scores列的学生列标识也为“ID”,则可以省略left_on='ID',right_on='ID' , 变成 pd.merge(student,scores)。

2、 如果两表中除了连接列外,还有相同列,则用indicator(标识)=True解决

pd.merge(student,scores,left_on='ID',right_on='SID',indicator=True)

二、学生表和分数表--外连接

自然连接即是内连接,对于两表中都存在的记录才会选择至新表中,而对于只有一个表中存在的记录,则不会选择。为解决这一问题,使用how=’left’或how=’right’。

【脚本】

print( pd.merge(student,scores,how='left',left_on='ID',right_on='SID',indicator=True) )

【结果】

   ID name  gender  age height  SID  CID Score     _merge

0  01   张三    True  20    1.88   01 A01   56.0       both

1  01   张三    True  20    1.88   01 A02   78.0       both

……

11 07   刘九    True  19    1.71 NaN  NaN    NaN left_only

【说明】

1、结果多了一行,ID=07的记录被选择至新表中

2、怎样查出没有考试的学生,可以这样写:

frame =pd.merge(student,scores,how='left',left_on='ID',right_on='SID',indicator=True)
print( frame[pd.isna(frame['SID'])==True]['name'] )三、按照索引号连接

还有一种常用的连接,即用索引号连接。

【脚本】

scores.index=[0,0,1,2,2,2,3,3,4,5,5]
print(scores.join(student))
print(student.join(scores))

【结果】

SID  CID  Score ID name  gender  age height

0 01  A01     56 01   张三    True  20    1.88

……

5 06  B01     90 06   陈八   False  17    1.60

   IDname  gender  age height  SID  CID Score

0 01   张三    True  20    1.88   01 A01   56.0

……

5 06   陈八   False  17    1.60   06 B01   90.0

6  07   刘九    True  19    1.71  NaN NaN    NaN

【说明】

第一个Print以scores为主表,关联student表,没有ID=07的记录

第一个Print以studentscores为主表,关联scores表,有ID=07的记录


四、应用

结合分组和聚合计算,统计每个学生的平均分。

【脚本】

print(   frame['Score'].groupby(frame['name']).mean() )等价于print( (  frame.groupby(  frame['name']  )['Score']  ).mean()  )

【结果】

name

刘九    NaN

……

赵六   73.5

陈八   83.0

【说明】

注意第二种写法中,需要将frame.groupby(frame['name']) 用“()括起来,原因后面的['Score']是前面整体结果的字段,而不是groupby()的字段。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 数据表 Indicator Students Student

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-10 02:45