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

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


二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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