Pandas 数据分析,高中体测练习

 

分析体测成绩

需求:

体侧成绩转变成分数

进一步,画图,分布,体重正常,肥胖,偏瘦比例,绘制饼图

男生跑步1000成绩,不及格,及格,中等,良好,优秀,柱状图绘制

 

 

导包、读取文件

import numpy as np

import pandas as pd

from pandas import Series,DataFrame

import matplotlib.pyplot as plt
%matplotlib inline
data = pd.read_excel('18级高一体测成绩汇总.xls')
data
班级性别姓名1000米50米跳远体前屈引体肺活量身高体重BMI 
0 1 高孜阳0611 4'13 8.88 195 12 1 2785 170 72.6 NaN
1 1 郝少杰1013 4'16 7.70 225 11 7 3133 174 52.7 NaN
2 1 郝梓烨0619 4'09 8.45 218 14 1 3901 169 46.5 NaN
3 1 何弘源1010 4'21 8.05 206 13 1 4946 183 79.7 NaN
4 1 刘硕鹏1212 3'44 7.52 210 13 9 3538 171 54.7 NaN
... ... ... ... ... ... ... ... ... ... ... ... ...
488 17 张乔楠0311 4'23 8.27 208 10 0 4647 176 69.5 NaN
489 17 郭泽森0333 5'19 9.55 210 15 6 7042 177 76 NaN
490 17 陈子龙061X 3'25 7.5 252 13 13 5755 181 65 NaN
491 17 王丹龙0636 4'39 7.81 208 14 11 5688 172 51.7 NaN
492 17 王玉涵0636 NaN NaN NaN NaN NaN NaN NaN NaN NaN
# 清洗数据
cond = data['班级'] != '班级' # 把有班级那一行的数据给删除

data = data[cond]   # 得到新的数据

data[:45]
班级性别姓名1000米50米跳远体前屈引体肺活量身高体重BMI 
0 1 高孜阳0611 4'13 8.88 195 12 1 2785 170 72.6 NaN
1 1 郝少杰1013 4'16 7.70 225 11 7 3133 174 52.7 NaN
2 1 郝梓烨0619 4'09 8.45 218 14 1 3901 169 46.5 NaN
3 1 何弘源1010 4'21 8.05 206 13 1 4946 183 79.7 NaN
4 1 刘硕鹏1212 3'44 7.52 210 13 9 3538 171 54.7 NaN
5 1 刘运硕0314 3'49 7.94 190 20 7 3970 175 66.4 NaN
6 1 吕晓瑶0314 3'54 7.75 186 11 7 3710 173 53.9 NaN
7 1 米孜聪0636 4'3 8.06 195 3 1 5578 178 83.1 NaN
8 1 聂浩然2719 4'01 7.75 220 15 10 3821 175 66.5 NaN
9 1 牛苗嘉1211 4'12 7.38 245 17 11 4423 167 53.9 NaN
10 1 牛砚哲2813 4 7.82 219 13 11 4031 173 57.4 NaN
11 1 齐子涵185x 4'13 7.37 228 9 15 4354 163 54.6 NaN
12 1 乔一甲0616 3'45 7.66 202 7 3 2238 179 61.1 NaN
13 1 任晓波0311 3'46 7.66 245 3 7 4811 177 63.9 NaN
14 1 戎小龙2633 0 0 0 0 0 0 0 NaN NaN
15 1 桑淳熙0616 3'57 7.60 192 7 5 4147 174 59.2 NaN
16 1 田晓龙2411 4'18 8.14 210 8 4 4241 179 61.9 NaN
17 1 田玉聪2716 3'32 7.20 255 22 12 5324 183 63.4 NaN
18 1 王晨宇0613 3'56 8.15 207 13 12 4363 173 60.5 NaN
19 1 王家梁0630 3'47 8.15 202 13 16 5364 174 56 NaN
20 1 王乐天3331 3'53 7.85 210 3 7 3445 177 56.9 NaN
21 1 王一钊1213 3'57 7.85 220 9 2 5670 177 55.5 NaN
22 1 王子天0634 3'42 7.23 212 12 15 5709 185 72.3 NaN
23 1 王子鑫0012 4'3 7.68 218 15 3 4780 177 83.7 NaN
24 1 未晓锟1214 4'14 8.30 206 15 1 3358 173 46.6 NaN
25 1 张国瑞033x 4'04 8.15 205 9 5 3494 169 48.3 NaN
26 1 张皓天0632 4'04 7.55 190 12 5 3286 169 50.1 NaN
27 1 张泽地0310 4'02 7.55 240 5 12 4483 171 58.4 NaN
28 1 张智贤0318 3'57 7.89 220 9 11 4254 166 54.8 NaN
29 1 赵博翰101x 4'16 8.19 212 27 7 3498 169 68 NaN
30 1 赵泽凯0311 4'01 7.89 213 5 11 4322 174 55.9 NaN
31 1 赵泽宇0616 4'08 8.21 208 19 20 3917 166 51.9 NaN
32 1 左晶川1217 4'06 8.71 206 11 4 3970 172 47.8 NaN
34 2 贾和0633 4'22 7.97 215 9 9 3865 175 58.7 NaN
35 2 李森0636 0 0 0 0 0 0 0 NaN NaN
36 2 李一帆1812 4'46 8.79 172 7 1 4750 174 88.6 NaN
37 2 李子阳0618 4'01 7.37 210 2 7 4714 182 62.5 NaN
38 2 吕星繁0312 0 0 0 0 0 0 0 NaN NaN
39 2 赵凌云105x 4'13 7.77 208 8 7 4327 173 56 NaN
40 2 赵鹏悦2612 4'27 8.8 185 10 5 4745 164 74.8 NaN
42 3 宫诚博0612 3'43 6.89 276 16 12 5212 1.84 73.1 NaN
43 3 郭亚浩181X 4'04 7.25 240 13 8 4756 1.76 72 NaN
44 3 郝晓辰0013 3'38 7.36 246 22 11 4433 1.84 62.5 NaN
45 3 李国玺2310 4'19 8.17 220 18 1 4438 1.74 72.2 NaN
46 3 李一帆1218 4'08 7.8 227 15 1 6033 1.77 85.6 NaN
data.fillna(0, inplace=True)  # 没有参加体侧的同学分数都填充成0
# 没有空数据了
data.isnull().any() #查询是否还有空数据
班级       False
性别       False
姓名       False
1000米   False
50米     False
跳远       False
体前屈     False
引体       False
肺活量     False
身高       False
体重       False
BMI     False
dtype: bool
data.head()
班级性别姓名1000米50米跳远体前屈引体肺活量身高体重BMI 
0 1 高孜阳0611 4'13 8.88 195.0 12 1 2785 170.0 72.6 0.0
1 1 郝少杰1013 4'16 7.70 225.0 11 7 3133 174.0 52.7 0.0
2 1 郝梓烨0619 4'09 8.45 218.0 14 1 3901 169.0 46.5 0.0
3 1 何弘源1010 4'21 8.05 206.0 13 1 4946 183.0 79.7 0.0
4 1 刘硕鹏1212 3'44 7.52 210.0 13 9 3538 171.0 54.7 0.0

把数据中的 4'13 转换成 小数

def convert(x):
   
  if isinstance(x, str):
      minute, second = x.split("'")
      minute = int(minute)
      second = int(second)
      return minute + second / 100.0
  else:
      return x


data['1000米'] = data['1000米'].map(convert)   # 映射
data.head()

班级 性别 姓名 1000米 50米 跳远 体前屈 引体 肺活量 身高 体重 BMI 0 1 高孜阳0611 4.13 8.88 195.0 12 1 2785 170.0 72.6 0.0 1 1 郝少杰1013 4.16 7.70 225.0 11 7 3133 174.0 52.7 0.0 2 1 郝梓烨0619 4.09 8.45 218.0 14 1 3901 169.0 46.5 0.0 3 1 何弘源1010 4.21 8.05 206.0 13 1 4946 183.0 79.7 0.0 4 1 刘硕鹏1212 3.44 7.52 210.0 13 9 3538 171.0 54.7 0.0

加载体侧成绩评分表

score = pd.read_excel('体侧成绩评分表.xls', header = [0,1]) 
score

男肺活量 女肺活量 男50米跑 女50米跑 男体前屈 ... 女跳远 男引体 女仰卧 男1000 女800 成绩 分数 成绩 分数 成绩 分数 成绩 分数 成绩 分数 ... 成绩 分数 成绩 分数 成绩 分数 成绩 分数 成绩 分数 0 4540 100 3150 100 7.1 100 7.8 100 23.6 100 ... 204 100 16.0 100 53 100 3'30" 100 3'24" 100 1 4420 95 3100 95 7.2 95 7.9 95 21.5 95 ... 198 95 15.0 95 51 95 3'35" 95 3'30" 95 2 4300 90 3050 90 7.3 90 8.0 90 19.4 90 ... 192 90 14.0 90 49 90 3'40" 90 3'36" 90 3 4050 85 2900 85 7.4 85 8.3 85 17.2 85 ... 185 85 13.0 85 46 85 3'47" 85 3'43" 85 4 3800 80 2750 80 7.5 80 8.6 80 15.0 80 ... 178 80 12.0 80 43 80 3'55" 80 3'50" 80

把男1000 成绩 3'30 转换成小数

def convert(item):
  m, s = item.strip('"').split("'")
  m, s = int(m),int(s)
   
  return m + s / 100.0

score.iloc[:,-4] = score.iloc[:,-4].map(convert) # 获取它的索引

把女800 成绩 3'30 转换成小数

def convert(item):
  m, s = item.strip('"').split("'")
  m, s = int(m),int(s)
   
  return m + s / 100.0

score.iloc[:,-2] = score.iloc[:,-2].map(convert) # 获取它的索引

对应索引 男1000 男50米跑

data.columns =['班级', '性别', '姓名', '男1000', '男50米跑', '跳远', '体前屈', '引体', '肺活量', '身高', '体重',
      'BMI']
data
s.dtypes
成绩    float64
分数     int64
dtype: object
data.dtypes
data['男50米跑'] = data['男50米跑'].astype(np.float)   # 转换数据类型
data
for col in [ '男1000', '男50米跑']:
   
  s = score[col]   # 获取成绩的标准
   
  def convert(x):
      for i in range(len(s)):   # 获取长度循环
          if x <= s['成绩'].iloc[0]:
              if x == 0:       # 判断是否没有成绩
                  return 0    
              return 100
          elif x > s['成绩'].iloc[-1]:
              return 0     # 跑得太慢
          elif (x > s['成绩'].iloc[i - 1]) and (x <= s['成绩'].iloc[i]):
              return s['分数'].iloc[i]
       
       
  data[col + '成绩'] = data[col].map(convert)   # 增加一列
   
   
  # 这里会报错 数据类型不对   我们在上面转换一下数据类型

转换 '跳远', '体前屈', '引体', '肺活量'

data.columns
score.head()
for col in ['跳远', '体前屈', '引体', '肺活量']:
  s = score['男' + col]
   
   
  def convert(x):
      for i in range(len(s)):
          if x >= s['成绩'].iloc[i]:
              return s['分数'].iloc[i]
      return 0
   
  data[col + '成绩'] = data[col].map(convert)
data.head()

班级 性别 姓名 男1000 男50米跑 跳远 体前屈 引体 肺活量 身高 体重 BMI 男1000成绩 男50米跑成绩 跳远成绩 体前屈成绩 引体成绩 肺活量成绩 0 1 高孜阳0611 4.13 8.88 195.0 12 1 2785 170.0 72.6 0.0 72 66 60 74 0 62 1 1 郝少杰1013 4.16 7.70 225.0 11 7 3133 174.0 52.7 0.0 70 78 74 74 60 68 2 1 郝梓烨0619 4.09 8.45 218.0 14 1 3901 169.0 46.5 0.0 74 70 70 78 0 80 3 1 何弘源1010 4.21 8.05 206.0 13 1 4946 183.0 79.7 0.0 68 74 64 76 0 100 4 1 刘硕鹏1212 3.44 7.52 210.0 13 9 3538 171.0 54.7 0.0 85 78 66 76 68 74

data.columns

cols = ['班级', '性别', '姓名', '男1000','男1000成绩', '男50米跑', '男50米跑成绩', '跳远', '跳远成绩','体前屈', '体前屈成绩', '引体','引体成绩', '肺活量', '肺活量成绩', '身高', '体重', 'BMI', ]

cols = ['班级', '性别', '姓名', '男1000','男1000成绩', '男50米跑', '男50米跑成绩', '跳远', '跳远成绩','体前屈',
'体前屈成绩', '引体','引体成绩', '肺活量', '肺活量成绩', '身高',
      '体重', 'BMI', ]
# 根据索引的顺序去DataFrame中取值
data[cols]

计算体重

h = data['身高'] 
h[:50]
def convert(x):
  if x >100:
      return x/100
  return x
data['身高'] = data['身高'].map(convert)
data['BMI'] = (data['体重'] / data['身高']**2).round(1)  # 保留1位小数
data.head()
班级  性别  姓名  男1000   男50米跑   跳远  体前屈 引体  肺活量 身高  体重  BMI 男1000成绩 男50米跑成绩 跳远成绩    体前屈成绩   引体成绩    肺活量成绩

0 1 高孜阳0611 4.13 8.88 195.0 12 1 2785 1.70 72.6 25.12 72 66 60 74 0 62 1 1 郝少杰1013 4.16 7.70 225.0 11 7 3133 1.74 52.7 17.41 70 78 74 74 60 68 2 1 郝梓烨0619 4.09 8.45 218.0 14 1 3901 1.69 46.5 16.28 74 70 70 78 0 80 3 1 何弘源1010 4.21 8.05 206.0 13 1 4946 1.83 79.7 23.80 68 74 64 76 0 100 4 1 刘硕鹏1212 3.44 7.52 210.0 13 9 3538 1.71 54.7 18.71 85 78 66 76 68 74 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 488 17 张乔楠0311 4.23 8.27 208.0 10 0 4647 1.76 69.5 22.44 68 72 66 72 0 100 489 17 郭泽森0333 5.19 9.55 210.0 15 6 7042 1.77 76.0 24.26 40 50 66 80 50 100 490 17 陈子龙061X 3.25 7.50 252.0 13 13 5755 1.81 65.0 19.84 100 80 90 76 85 100 491 17 王丹龙0636 4.39 7.81 208.0 14 11 5688 1.72 51.7 17.48 62 76 66 78 76 100 492 17 王玉涵0636 0.00 0.00 0.0 0 0 0 0.00 0.0 NaN 0 0 0 50 0 0

def convert_bmi(x):
  if x >= 26.4:
      return 60
  elif (x <= 16.4) or (x > 23.3 and x < 26.3):
      return 80
  elif x >= 16.5 and x <= 23.2:
      return 100
  return 0
data['BMI_score'] = data['BMI'].map(convert_bmi)
班级性别姓名男1000男50米跑跳远体前屈引体肺活量身高体重BMI男1000成绩男50米跑成绩跳远成绩体前屈成绩引体成绩肺活量成绩BMI_score 
0 1 高孜阳0611 4.13 8.88 195.0 12 1 2785 1.70 72.6 25.12 72 66 60 74 0 62 80
1 1 郝少杰1013 4.16 7.70 225.0 11 7 3133 1.74 52.7 17.41 70 78 74 74 60 68 100
2 1 郝梓烨0619 4.09 8.45 218.0 14 1 3901 1.69 46.5 16.28 74 70 70 78 0 80 80
3 1 何弘源1010 4.21 8.05 206.0 13 1 4946 1.83 79.7 23.80 68 74 64 76 0 100 80
4 1 刘硕鹏1212 3.44 7.52 210.0 13 9 3538 1.71 54.7 18.71 85 78 66 76 68 74 100
5 1 刘运硕0314 3.49 7.94 190.0 20 7 3970 1.75 66.4 21.68 80 74 50 90 60 80 100
6 1 吕晓瑶0314 3.54 7.75 186.0 11 7 3710 1.73 53.9 18.01 80 76 40 74 60 78 100
7 1 米孜聪0636 4.03 8.06 195.0 3 1 5578 1.78 83.1 26.23 76 74 60 62 0 100 80
8 1 聂浩然2719 4.01 7.75 220.0 15 10 3821 1.75 66.5 21.71 76 76 72 80 72 80 100
9 1 牛苗嘉1211 4.12 7.38 245.0 17 11 4423 1.67 53.9 19.33 72 85 85 80 76 95 100
10 1 牛砚哲2813 4.00 7.82 219.0 13 11 4031 1.73 57.4 19.18 78 76 72 76 76 80 100
11 1 齐子涵185x 4.13 7.37 228.0 9 15 4354 1.63 54.6 20.55 72 85 76 70 95 90 100
12 1 乔一甲0616 3.45 7.66 202.0 7 3 2238 1.79 61.1 19.07 85 78 62 68 20 30 100
13 1 任晓波0311 3.46 7.66 245.0 3 7 4811 1.77 63.9 20.40 85 78 85 62 60 100 100
14 1 戎小龙2633 0.00 0.00 0.0 0 0 0 0.00 0.0 NaN 0 0 0 50 0 0 0
15 1 桑淳熙0616 3.57 7.60 192.0 7 5 4147 1.74 59.2 19.55 78 78 50 68 40 85 100
16 1 田晓龙2411 4.18 8.14 210.0 8 4 4241 1.79 61.9 19.32 70 72 66 70 30 85 100
17 1 田玉聪2716 3.32 7.20 255.0 22 12 5324 1.83 63.4 18.93 95 95 90 95 80 100 100
18 1 王晨宇0613 3.56 8.15 207.0 13 12 4363 1.73 60.5 20.21 78 72 64 76 80 90 100
19 1 王家梁0630 3.47 8.15 202.0 13 16 5364 1.74 56.0 18.50 85 72 62 76 100 100 100
20 1 王乐天3331 3.53 7.85 210.0 3 7 3445 1.77 56.9 18.16 80 76 66 62 60 74 100
21 1 王一钊1213 3.57 7.85 220.0 9 2 5670 1.77 55.5 17.72 78 76 72 70 10 100 100
22 1 王子天0634 3.42 7.23 212.0 12 15 5709 1.85 72.3 21.12 85 90 68 74 95 100 100
23 1 王子鑫0012 4.03 7.68 218.0 15 3 4780 1.77 83.7 26.72 76 78 70 80 20 100 60
24 1 未晓锟1214 4.14 8.30 206.0 15 1 3358 1.73 46.6 15.57 72 72 64 80 0 72 80
25 1 张国瑞033x 4.04 8.15 205.0 9 5 3494 1.69 48.3 16.91 76 72 64 70 40 74 100
26 1 张皓天0632 4.04 7.55 190.0 12 5 3286 1.69 50.1 17.54 76 78 50 74 40 70 100
27 1 张泽地0310 4.02 7.55 240.0 5 12 4483 1.71 58.4 19.97 76 78 80 64 80 95 100
28 1 张智贤0318 3.57 7.89 220.0 9 11 4254 1.66 54.8 19.89 78 76 72 70 76 85 100
29 1 赵博翰101x 4.16 8.19 212.0 27 7 3498 1.69 68.0 23.81 70 72 68 100 60 74 80
30 1 赵泽凯0311 4.01 7.89 213.0 5 11 4322 1.74 55.9 18.46 76 76 68 64 76 90 100
31 1 赵泽宇0616 4.08 8.21 208.0 19 20 3917 1.66 51.9 18.83 74 72 66 85 100 80 100
32 1 左晶川1217 4.06 8.71 206.0 11 4 3970 1.72 47.8 16.16 74 66 64 74 30 80 80
34 2 贾和0633 4.22 7.97 215.0 9 9 3865 1.75 58.7 19.17 68 74 70 70 68 80 100
35 2 李森0636 0.00 0.00 0.0 0 0 0 0.00 0.0 NaN 0 0 0 50 0 0 0
36 2 李一帆1812 4.46 8.79 172.0 7 1 4750 1.74 88.6 29.26 50 66 10 68 0 100 60
37 2 李子阳0618 4.01 7.37 210.0 2 7 4714 1.82 62.5 18.87 76 85 66 60 60 100 100
38 2 吕星繁0312 0.00 0.00 0.0 0 0 0 0.00 0.0 NaN 0 0 0 50 0 0 0
39 2 赵凌云105x 4.13 7.77 208.0 8 7 4327 1.73 56.0 18.71 72 76 66 70 60 90 100
40 2 赵鹏悦2612 4.27 8.80 185.0 10 5 4745 1.64 74.8 27.81 66 66 40 72 40 100 60
42 3 宫诚博0612 3.43 6.89 276.0 16 12 5212 1.84 73.1 21.59 85 100 100 80 80 100 100
43 3 郭亚浩181X 4.04 7.25 240.0 13 8 4756 1.76 72.0 23.24 76 90 80 76 64 100 0
44 3 郝晓辰0013 3.38 7.36 246.0 22 11 4433 1.84 62.5 18.46 90 85 85 95 76 95 100
45 3 李国玺2310 4.19 8.17 220.0 18 1 4438 1.74 72.2 23.85 70 72 72 85 0 95 80
46 3 李一帆1218 4.08 7.80 227.0 15 1 6033 1.77 85.6 27.32 74 76 76 80 0 100 60
47 3 刘凡1218 4.09 8.06 208.0 10 2 4106 1.70 68.7 23.77 74 74 66 72 10 85 80
48 3 刘哲垚1217 4.09 8.16 190.0 2 6 4214 1.67 60.7 21.76 74 72 50 60 50 85 100
49 3 米卓凡241X 4.05 8.16 200.0 13 9 3857 1.72 51.4 17.37 76 72 62 76 68 80 100
50 3 牛卓凡0614 4.02 8.27 228.0 14 12 3266 1.62 52.2 19.89 76 72 76 78 80 70 100
51 3 苏仕一1233 4.01 8.50 215.0 6 9 3578 1.64 49.9 18.55 76 70 70 66 68 76 100

统计分析

定义需求,画图,对比分析

(data['BMI_score'].value_counts()).plot(kind = 'pie', autopct = "%0.2f%%")

img

(data['BMI_score'].value_counts()).plot(kind = 'bar')

img

data.groupby(['男1000成绩'])['BMI_score'].count().plot()

img

posted @ 2020-01-09 11:23  quietz  阅读(1098)  评论(1编辑  收藏  举报