全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 python论坛
876 0
2020-08-27

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

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

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

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()的字段。


二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群