Pandas 數據分析,高中體測練習

 

分析體測成績

需求:

體側成績轉變成分數

開卷考試

excel完成能夠

pandas讀取excel代碼中 完成

一個手輸入

進一步,畫圖,分佈,體重正常,肥胖,偏瘦比例,繪製餅圖

男生跑步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.0spa

加載體側成績評分表

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" 80excel

把男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', ]ip

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 0pandas

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

相關文章
相關標籤/搜索