我们知道查询就是指定一堆条件的特殊选择,所以,查询就可以看作是数据的选择,只不过涉及的表多,条件多。所以,在学习本节之前,我还是先回顾了一下Frame数据的选择——https://bbs.pinggu.org/thread-9488020-1-1.html。
接下来,我们仍以“学生、学分”两个表为对象,一步一步从简入繁,学习查询:
一、单表子查询1、如:求身高最高的学生的姓名第一步,找出最高身高的值
【脚本】
a = student['height'].max()
print(type(a),'\n',a)
【结果】
<class 'float'>
1.88
【说明】
这里的语法结构是:表名[选择的字段].聚合函数()
第二步,依据该身高查到学生的姓名
【脚本】
b = student[student['height'] == a]['name']print(type(b), '\n', b)
【结果】
<class 'pandas.core.series.Series'>
0 张三
Name: name, dtype: object
【说明】
这里的语法结构是:表名[条件] [ 选择的字段]
拆解为:
表名[条件] = 新DataFrame
新DataFrame [ 选择的字段] 即为所要选择的信息
2、求身高最高的女生的姓名【脚本】
a = student[student['gender'] == False]['height'].max()frame1 = student[(student['height'] == a) & (student['gender'] == False)]['name']
print(type(frame1), '\n', frame1)
【结果】
<class 'pandas.core.series.Series'>
1 李四
Name: name, dtype: object
【说明】
1、这里的语法结构仍是:表名[条件] [ 选择的字段]
2、当多个条件都需要满足时,结构为:表名[(条件1)&(条件2)],注意一定要在条件外加上小括号哦。
3、求身高排前2名的学生姓名【脚本】
a = student['height'].sort_values(by=['height'], ascending=False).head(2)这个写法会报错,应该用以下写法:a = student['height'].sort_values( ascending=False).head(2)另外,为防止前两行返回的身高值相同,需要删除相同的身高再取前两2名,语句如下:a = student['height'].drop_duplicates().sort_values(ascending=False).head(2) b = student[student['height'].isin(a)]['name']print(type(b),'\n',b)
【结果】
<class 'pandas.core.series.Series'>
0 张三
2 王五
Name: name, dtype: object
【说明】
1、尽管我们在学sort_values时,提到过一般的形式为sort_values(by=[字段],ascending=False/True),但是这里如果前面已经选择了字段’’,后面就不能再指定排序字段了,否则报错如下:
sort_values() got an unexpected keywordargument 'by'.
2、新知识点,去重方法:drop_duplicates()
二、多表子查询1、学生‘王五’所有选修的课程成绩
【脚本】
a = frame['SID'][frame['name'] == '王五'].drop_duplicates()
b = frame[frame['ID'].isin(a) ]['Score']
print(type(b), '\n', b)
【结果】
<class 'pandas.core.series.Series'>
2 74.0
2 86.0
2 89.0
Name: Score, dtype: float64
【说明】
注意,我们第一个子查询,可能会查到多个名字为‘王五’的同学,所以,a变量是一个序列,所以,第二个查询中使用了isin(a)
2、查找和学生‘王五’年龄一样的同学姓名【脚本】
a = frame['age'][frame['name'] == '王五'].drop_duplicates()
b = frame[(frame['age'].isin(a) ) &( frame['name'] != '王五')]['name']
print(type(b), '\n', b)
【结果】
<class 'pandas.core.series.Series'>
6 刘九
Name: name, dtype: object
【说明】
我又犯错了,在frame[(条件1)& (条件2)] 时,在条件1外加了’[ ]’,实际上直接用’()’即可。
三、总结今天学的知识点有:
1、 表名[选择的字段].聚合函数()
2、 表名[(条件1)&(条件2)] [ 选择的字段]
3、 sort_values(by=[字段],ascending=False/True),但是这里如果需要选择的字段与需要排序的字段一样,就不能再指定排序字段,即不需要by参数了。
4、 去重方法:drop_duplicates()