Python3 numpy,pandas,DataFrame基本操作

本文以学生成绩表为例,做几道简单的题。

题目(1)

  1. 求出每名同学的总成绩
  2. 按总成绩排序
  3. 重置排序后的索引
  4. 按性别进行分组分析
  5. 按总分进行分组统计,300分以下,300-400,400分以上

代码

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

面试题目(1):Pandas中的groupby

问题一:示例数据如下,求每名学生(ID)对应的成绩(score)最高的那门科目(class)与ID,用Python实现:

Python3 numpy,pandas,DataFrame基本操作_第1张图片

要求输出形式如下:

解题方案:按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']

问题二:如果有学生他的某些科目的成绩是一样的,如下面的示例数据:

Python3 numpy,pandas,DataFrame基本操作_第2张图片

在上面数据中,第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参数:

  1.  'average':默认:在相等的分组中,为各个值分配平均排名
  2. 'min':使用整个分组中最小的排名
  3. 'max':使用整个分组中最大的排名
  4. 'first':按值在原始数据中出现的顺序排名

本次更新到此结束,欢迎随时回访观看更新记录~~

你可能感兴趣的:(Python数据分析和可视化)