在实际使用中,我们往往需要多张表一起连接才能使用,以下记录多表连接的方法:
一、学生表和分数表--自然连接学生表和分数表建表如下(由于字数限制,我将脚本截图了):
【脚本】
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()的字段。