Leo的假期学习记录python大数据入门篇(4)

这次拖得比较晚,原因就是考驾照(摸鱼)去了,科四杀我,每次都没法98,然后就要不停地重复模拟考试,害

# 子查询:利用其它查询的结果作为当前查询条件
import pandas as pd

data1 = {'ID': ['000001', '000002', '000003', '000004', '000005', '000006', '000007'],
         'name': ['王磊', '莫成辉', '施彰哲', '刘晨尧', '夏斯超', '陈智', '徐志远'],
         'gender': [True, False, True, False, True, False, True],
         'age': [16, 20, 18, 18, 17, 18, 16],
         'height': [1.88, 1.86, 1.81, 1.86, 1.74, 1.75, 1.76]
         }
students = pd.DataFrame(data1)
data2 = {'SID': ['000001', '000001', '000002', '000003',
                 '000003', '000003', '000004', '000004',
                 '000005', '000006', '000006'],
         'CID': ['A01', 'A02', 'A01', 'A01', 'A02',
                 'B01', 'A01', 'A03', 'B01', 'A02', 'B01'],
         'score': [56, 78, 90, 74, 86, 89, 67, 80, 77, 76, 90]
         }
scores = pd.DataFrame(data2)
# 将身高最高的学生信息打印出来,根据 最大值 查询 学生姓名,并框定查询范围
# print(students[(students['gender']==False)&[students['height']==students['height'].max()]])
# 比较奇怪的几点,1:为什么上种方法打印报错?感觉没啥问题。回答:女生没有一个符合全体最高的,因为我的查询数据是在students表格里查询的,
# 并不是在其最终的女生库里查询,所以报错,就等于你在赛扬里面找英特尔最高性能的cpu一样,根本没有,(笑)
'''
maxheight = students[students['gender']== False]['height'].max()
print(students[(students['gender']==False)& (students['height']==maxheight)])'''
# 查询前两个高数据本来想在女生表格里找的,但是发现怎么写都不对,还是老老实实两次吧,drop_duplicates()是去重
maxheight = students['height'].drop_duplicates().sort_values(ascending=False).head(2)
# 将所有等于这些身高的人输出,isin表示在这个范围之内,因为这里有两个数,所以不能==
# print(students[students['height'].isin(maxheight)])
'''
#这里的这个东西比较混乱,我的理解是:将name是王磊的id赋值给sid
sid = students[students['name']=='王磊']['ID']
#考虑到有多个数值,最好用isin
print(scores[scores['SID']==sid[0]])
#也可以直接连接两个表格
frame = pd.merge(students,scores,left_on='ID',right_on = 'SID')#这里还是不输入left,right会报错,分析原因:两个表格标准不一样,需要定制一个标准,左边的是标准
print(frame[frame['name']=='王磊'])
'''

'''
# 查询和王磊年龄一样的人的 数据
age = students[students['name'] == '王磊']['age']
print(students[(students['age'].isin(age)) & (students['name'] != '王磊')]['name'])
'''

'''
#使用连接来搞(说实话,我不明白,这不是做了一个一摸一样的表格吗#表面看是右边的没有形同名字在一起的,为撒叻,
  解答:因为按照年龄连接两个表就是两个表里年龄相同的记录合并成为一条新纪录,例如a和b都是16岁,那么就会生成aa bb ab ba四条新纪录
frame = pd.merge(students,students,left_on='age',right_on='age')
print(frame)
print('****************************************************')
print(frame[(frame['name_x']=='王磊')&(frame['name_y']!='王磊')]['name_y'])'''

#查询学生的最高成绩----->查询相对应的课程号----->查询每个学生最高成绩额的课程号
#frame1 = scores.groupby('SID')['score'].max()
#print(frame1)
#frame2 = pd.merge(scores ,frame1,right_on='SID', left_on='SID')#这里right_on='SID', left_on='SID'位置反了不影响输出
#print(frame2)
#print(frame2[frame2['score_x'] == frame2['score_y']][['SID','CID']])
'''或者:
frame2 = pd.merge(scores ,frame1,right_on=['SID','score'], left_on=['SID','score'])
print(frame2['SID','CID'])
#或者:
idMax = scoers.groupby('SID')['score'].idxmax()#这里的idMax()是寻找行索引号
print(scores[scores.index.isin(idxMax)][['SID','CID']])
#或者:
scores = scores.sort_values(by=['SID','score'],ascending=[True,False])#所打印出来的就是所有SID,的score按照从高到低排序,这样,每个SID的第一条信息就是他的最高分
#这里需要的就是提取每个SID的第一行数据,添加一个RANK列,然后取每个第0行
scores['rank'] = scores.groupby(['SID']).cunciunt()
ptint(scores[score['rank'] == 0][['SID','CID,']])
'''

#下面进行案例查询选了A01的学生的A02的成绩是多少
'''
#法一:
CIDs = scores[scores['CID'] == 'A01']['SID']
print(scores[(scores['SID'].isin(CIDs))&  (scores['CID']=='A02')])
#法二:
frame = pd.merge(scores, scores,right_on='SID',left_on='SID')
print(frame[(frame['CID_x']=='A01')&(frame['CID_y']=='A02')][['SID','CID_y','score_y']])
#法三:透视图
frame = scores.pivot_table(values='score', index='SID', columns='CID', fill_values=-1)
print(frame)
 #看那些学生选择了A01 & A02
print(frame.loc[(frame['A01'] !=-1) & (frame['A02'] != -1)]['A02']
'''

这次的子查询,我学习了之后,感觉挺简单的,重要就是思路,并不是语法部分,不能够直接print的时候我感觉还是可以分部然后print(frame)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值