本文以学生成绩表为例,做几道简单的题。
代码:
1.求出每名同学的总成绩
import pandas as pd
import numpy as np
stu_score=pd.read_excel ('./data/stu_scores.xlsx')
#print(stu_score)
#1.求总成绩
stu_score['Sum']=stu_score.iloc[:,2:].sum(axis=1)
print(stu_score)
结果:
Number Gender Chinese Math Engish Physics Chemistry Sum
0 14310320101 男 73 69 71 72 60 345
1 14310320102 女 72 67 70 71 62 342
2 14310320103 女 68 70 69 75 61 343
3 14310320104 男 62 71 67 76 64 340
4 14310320105 女 76 68 72 71 65 352
5 14310320106 男 68 67 68 70 60 333
6 14310320107 男 77 69 73 74 64 357
7 14310320108 男 67 56 62 60 47 292
8 14310320109 男 88 93 91 98 88 458
9 14310320110 女 77 69 73 77 65 361
10 14310320111 男 67 56 62 60 51 296
11 14310320112 男 76 74 75 77 68 370
12 14310320113 男 80 91 86 100 84 441
13 14310320114 男 62 57 60 61 50 290
14 14310320115 女 74 73 74 82 67 370
15 14310320116 女 80 79 80 87 70 396
16 14310320117 男 77 69 73 75 65 359
17 14310320118 男 67 56 62 61 48 294
18 14310320119 女 52 48 50 57 43 250
19 14310320120 女 68 70 69 77 62 346
20 14310320121 女 62 71 67 75 62 337
21 14310320122 男 76 68 72 72 63 351
22 14310320123 女 66 66 66 75 62 335
23 14310320124 女 68 70 69 75 64 346
24 14310320125 女 62 71 67 76 66 342
25 14310320126 男 76 68 72 76 61 353
26 14310320127 女 70 50 60 59 42 281
27 14310320128 男 73 82 78 91 75 399
28 14310320129 男 90 97 94 101 91 473
29 14310320130 男 64 64 64 71 59 322
2.按总成绩排序
#2.按总分进行排序
sum_sort=stu_score.sort_values(by=['Sum'],ascending=False)
print('排序后的成绩:\n',sum_sort)
#法二:可先将总成绩一列转成numpy,再排序,再转化为DataFrame
"""
list=stu_score['Sum']
array=np.array(list)
array.sort(axis=0)
print(array)
frame=pd.DataFrame(array)
print(frame)
"""
结果:
排序后的成绩:
Number Gender Chinese Math Engish Physics Chemistry Sum
28 14310320129 男 90 97 94 101 91 473
8 14310320109 男 88 93 91 98 88 458
12 14310320113 男 80 91 86 100 84 441
27 14310320128 男 73 82 78 91 75 399
15 14310320116 女 80 79 80 87 70 396
11 14310320112 男 76 74 75 77 68 370
14 14310320115 女 74 73 74 82 67 370
9 14310320110 女 77 69 73 77 65 361
16 14310320117 男 77 69 73 75 65 359
6 14310320107 男 77 69 73 74 64 357
25 14310320126 男 76 68 72 76 61 353
4 14310320105 女 76 68 72 71 65 352
21 14310320122 男 76 68 72 72 63 351
23 14310320124 女 68 70 69 75 64 346
19 14310320120 女 68 70 69 77 62 346
0 14310320101 男 73 69 71 72 60 345
2 14310320103 女 68 70 69 75 61 343
1 14310320102 女 72 67 70 71 62 342
24 14310320125 女 62 71 67 76 66 342
3 14310320104 男 62 71 67 76 64 340
20 14310320121 女 62 71 67 75 62 337
22 14310320123 女 66 66 66 75 62 335
5 14310320106 男 68 67 68 70 60 333
29 14310320130 男 64 64 64 71 59 322
10 14310320111 男 67 56 62 60 51 296
17 14310320118 男 67 56 62 61 48 294
7 14310320108 男 67 56 62 60 47 292
13 14310320114 男 62 57 60 61 50 290
26 14310320127 女 70 50 60 59 42 281
18 14310320119 女 52 48 50 57 43 250
3. 重置排序后的索引
#重置索引,从0开始
sum_sort=sum_sort.reset_index(drop=True)
print('重置索引后的结果:',sum_sort)
结果:
重置索引后的结果: Number Gender Chinese Math Engish Physics Chemistry Sum
0 14310320129 男 90 97 94 101 91 473
1 14310320109 男 88 93 91 98 88 458
2 14310320113 男 80 91 86 100 84 441
3 14310320128 男 73 82 78 91 75 399
4 14310320116 女 80 79 80 87 70 396
5 14310320112 男 76 74 75 77 68 370
6 14310320115 女 74 73 74 82 67 370
7 14310320110 女 77 69 73 77 65 361
8 14310320117 男 77 69 73 75 65 359
9 14310320107 男 77 69 73 74 64 357
10 14310320126 男 76 68 72 76 61 353
11 14310320105 女 76 68 72 71 65 352
12 14310320122 男 76 68 72 72 63 351
13 14310320124 女 68 70 69 75 64 346
14 14310320120 女 68 70 69 77 62 346
15 14310320101 男 73 69 71 72 60 345
16 14310320103 女 68 70 69 75 61 343
17 14310320102 女 72 67 70 71 62 342
18 14310320125 女 62 71 67 76 66 342
19 14310320104 男 62 71 67 76 64 340
20 14310320121 女 62 71 67 75 62 337
21 14310320123 女 66 66 66 75 62 335
22 14310320106 男 68 67 68 70 60 333
23 14310320130 男 64 64 64 71 59 322
24 14310320111 男 67 56 62 60 51 296
25 14310320118 男 67 56 62 61 48 294
26 14310320108 男 67 56 62 60 47 292
27 14310320114 男 62 57 60 61 50 290
28 14310320127 女 70 50 60 59 42 281
29 14310320119 女 52 48 50 57 43 250
4. 按性别进行分组分析
#3.按性别进行分组分析
sex_group=sum_sort.groupby(by='Gender')
sex_list=list(sex_group) #将sex_list强制转化成列表,查看分组后的数据
print(sex_list)
结果:
[('女', Number Gender Chinese Math Engish Physics Chemistry Sum
4 14310320116 女 80 79 80 87 70 396
6 14310320115 女 74 73 74 82 67 370
7 14310320110 女 77 69 73 77 65 361
11 14310320105 女 76 68 72 71 65 352
13 14310320124 女 68 70 69 75 64 346
14 14310320120 女 68 70 69 77 62 346
16 14310320103 女 68 70 69 75 61 343
17 14310320102 女 72 67 70 71 62 342
18 14310320125 女 62 71 67 76 66 342
20 14310320121 女 62 71 67 75 62 337
21 14310320123 女 66 66 66 75 62 335
28 14310320127 女 70 50 60 59 42 281
29 14310320119 女 52 48 50 57 43 250), ('男', Number Gender Chinese Math Engish Physics Chemistry Sum
0 14310320129 男 90 97 94 101 91 473
1 14310320109 男 88 93 91 98 88 458
2 14310320113 男 80 91 86 100 84 441
3 14310320128 男 73 82 78 91 75 399
5 14310320112 男 76 74 75 77 68 370
8 14310320117 男 77 69 73 75 65 359
9 14310320107 男 77 69 73 74 64 357
10 14310320126 男 76 68 72 76 61 353
12 14310320122 男 76 68 72 72 63 351
15 14310320101 男 73 69 71 72 60 345
19 14310320104 男 62 71 67 76 64 340
22 14310320106 男 68 67 68 70 60 333
23 14310320130 男 64 64 64 71 59 322
24 14310320111 男 67 56 62 60 51 296
25 14310320118 男 67 56 62 61 48 294
26 14310320108 男 67 56 62 60 47 292
27 14310320114 男 62 57 60 61 50 290)]
5. 按总分进行分组统计,300分以下,300-400,400分以上
#4.按总分进行分组统计,300分以下,300-400,400分以上
s_group1=sum_sort.loc[sum_sort['Sum']<300]
s_group2=sum_sort.loc[(sum_sort['Sum']>=300) & (sum_sort['Sum']<=400)]
s_group3=sum_sort.loc[sum_sort['Sum']>400]
print(s_group1)
结果:
Number Gender Chinese Math Engish Physics Chemistry Sum
24 14310320111 男 67 56 62 60 51 296
25 14310320118 男 67 56 62 61 48 294
26 14310320108 男 67 56 62 60 47 292
27 14310320114 男 62 57 60 61 50 290
28 14310320127 女 70 50 60 59 42 281
29 14310320119 女 52 48 50 57 43 250
问题一:示例数据如下,求每名学生(ID)对应的成绩(score)最高的那门科目(class)与ID,用Python实现:
要求输出形式如下:
解题方案:按ID做groupby,按score取最大值,用到三个函数:idxmax(),idxmin(),rank()
代码:
import pandas as pd
import numpy as np
df=pd.read_csv('./data/score.csv')
new_df=df.groupby('ID')['score'].idxmax()
for i in new_df:
print(df.iloc[i,:].tolist()[0:2])
结果:
[1, 'A']
[2, 'C']
[3, 'B']
[4, 'C']
衍生问题:输出ID对应的成绩最低的那门科目
new_score=df.groupby('ID')['score'].idxmin()
for i in new_score:
print(df.iloc[i,:].tolist()[0:2])
结果:
[1, 'C']
[2, 'A']
[3, 'C']
[4, 'A']
问题二:如果有学生他的某些科目的成绩是一样的,如下面的示例数据:
在上面数据中,第1,3名学生的最高成绩存在重复。需要用到rank()函数
代码:
df1['rank']=df1.groupby('ID')['score'].rank(method='min',ascending=False).astype(np.int64)
#print(df1)
print(df1[df1['rank']==1][['ID','class']])
结果:
ID class
0 1 A
1 1 B
5 2 C
7 3 B
8 3 C
11 4 C
打印df1可以看到,得到的df1 这个数据框添加了一列rank,就是每名学生的科目成绩排名,得到的df1如下:
ID class score rank
0 1 A 90 1
1 1 B 90 1
2 1 C 70 3
3 2 A 60 3
4 2 B 80 2
5 2 C 100 1
6 3 A 90 3
7 3 B 100 1
8 3 C 100 1
9 4 A 70 3
10 4 B 80 2
11 4 C 90 1
然后按需要取出数据即可。
DataFrame的几种排序:
排序默认的是按照字母顺序升序
sort_values()按多列排序时,by的列名顺序影响最终排序结果,例如by=['a','b'],按照a列排序后如有相同的再按照b列排序
按索引和按列名排序分别使用df.sort_index()、df.sort_index(axis=1)
rank()方法可以加参数ascending改变升降序,添加参数method来改变分组排序规则
rank()函数的method参数:
本次更新到此结束,欢迎随时回访观看更新记录~~