Python中DataFrame的子查询(笔记)

tech2022-10-29  107

我们知道查询就是指定一堆条件的特殊选择,所以,查询就可以看作是数据的选择,只不过涉及的表多,条件多。所以,在学习本节之前,我还是先回顾了一下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 keyword argument ‘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()

最新回复(0)