楼主: zwy_0309
1324 0

Python中DataFrame的子查询(笔记) [推广有奖]

  • 1关注
  • 3粉丝

硕士生

36%

还不是VIP/贵宾

-

威望
0
论坛币
342 个
通用积分
99.1487
学术水平
11 点
热心指数
9 点
信用等级
7 点
经验
4173 点
帖子
69
精华
0
在线时间
148 小时
注册时间
2019-6-4
最后登录
2024-3-29

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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


二维码

扫码加我 拉你入群

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

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

关键词:Dataframe python Frame Data Fram

已有 1 人评分经验 收起 理由
yunnandlg + 80 精彩帖子

总评分: 经验 + 80   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-8 01:59