把numpy和openpyxl结合起来,进行数据操作练习。
1.数据表格:
2.练习代码
import openpyxl
import numpy as np
# 1. openpyxl操作:读取数据、
wb=openpyxl.load_workbook(r'd:/Python Code/03 numpy pandas/学员成绩表.xlsx',data_only=True)
ws=wb.worksheets[0]
list1=list(ws.values)
# 2-1. np操作:自定义复合类型
# 注:如果不定义复合类型,data的结构为[[]……];自定义后,为[()……]
data=np.array(list1[1:],dtype={
"names":["学员编号","姓名","C语言","高等数学","逻辑学","英语","算法基础"],
"formats":["U7","U4","i","i","i","i","i"]})
# 2-2. 统计每列信息
ID=data["学员编号"]
Name=data["姓名"]
CPL=data["C语言"]
Maths=data["高等数学"]
Logic=data["逻辑学"]
English=data["英语"]
Algorithm=data["算法基础"]
# 2-3. 分别计算CPL的总分、平均分、最高分、最低分
print("CPl学科总分:",np.sum(CPL))
print("CPl学科平均分:","%.2f"%np.average(CPL))
print("CPl学科最高分:",np.max(CPL))
print("CPl学科最低分:",np.min(CPL))
# 2-4. 条件查询"names"字段信息、特定分值人员、特定人员
print("英语学科:",English) # 或者:data["英语"]
print([list(r)[1:] for r in data[Logic>=eval(input(("查询逻辑学()以上分值学员:")))]])
print(data[Name==input("输入待查询学员姓名:")])
# 2-5. 各科成绩排序
# sort()函数方法 --->注:axis = 1 按行排序, axis = 0 按列排序)
rank1=np.array([CPL,Maths,Logic,English,Algorithm])
print("各科排名(倒序):","\n",np.sort(rank1,axis=1)) # 顺序如何操作,还没研究出来
# sorted()函数方法
rank2=sorted(data,key=lambda x: x[2]+x[3]+x[4]+x[5]+x[6],reverse=True)
print("总分排名:","\n",np.array(rank2))
3.运行结果
C:\Users\Administrator\AppData\Local\Programs\Python\Python39\python.exe "D:/Python Code/03 numpy pandas/Numpy布尔索引掩码操作.py"
CPl学科总分: 1049
CPl学科平均分: 74.93
CPl学科最高分: 98
CPl学科最低分: 62
英语学科: [63 92 97 84 82 73 80 67 68 84 85 80 82 67]
查询逻辑学()以上分值学员:90
[['张三', 78, 87, 97, 63, 91], ['阿七', 98, 97, 92, 82, 82], ['黄九', 73, 64, 91, 80, 99]]
输入待查询学员姓名:王五
[('2022003', '王五', 62, 77, 74, 97, 66)]
各科排名(倒序):
[[62 62 62 64 64 70 73 76 78 82 83 87 88 98]
[64 69 77 78 79 85 87 87 91 91 93 96 96 97]
[64 67 67 68 74 77 79 80 84 87 88 91 92 97]
[63 67 67 68 73 80 80 82 82 84 84 85 92 97]
[66 67 68 70 72 77 77 82 82 91 91 95 96 99]]
总分排名:
[('2022005', '阿七', 98, 97, 92, 82, 82)
('2022002', '李四', 83, 96, 88, 92, 67)
('2022001', '张三', 78, 87, 97, 63, 91)
('2022010', '龚十二', 76, 87, 68, 84, 95)
('2022007', '黄九', 73, 64, 91, 80, 99)
('2022013', '前十五', 62, 91, 80, 82, 82)
('2022014', '后十六', 64, 93, 77, 67, 91)
('2022011', '左十三', 62, 78, 87, 85, 77)
('2022012', '右十四', 88, 69, 84, 80, 68)
('2022004', '赵六', 70, 96, 67, 84, 70)
('2022006', '鲍八', 82, 79, 79, 73, 72)
('2022008', '易十', 64, 91, 67, 67, 96)
('2022009', '雷十一', 87, 85, 64, 68, 77)
('2022003', '王五', 62, 77, 74, 97, 66)]
进程已结束,退出代码0