python数据处理实战

环境为notebook,对体测成绩汇总进行处理。

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

在这里插入图片描述

data[:45]

在这里插入图片描述

# 把有班级那一行的数据给删除,data['班级'],索引班级列
cond = data['班级'] != '班级'
data = data[cond]
data[:45]

在这里插入图片描述

#value : 变量, 字典, Series, or DataFrame 
#用于填充缺失值(例如0),或者指定为每个索引(对于Series)或列(对于DataFrame)使用哪个字典/Serise/DataFrame的值。
#inplace : boolean, 默认值 False。如果为Ture,在原地填满。
data.fillna(0,inplace=True)
# 没有空数据了
data.isnull().any()

在这里插入图片描述

data.dtypes

在这里插入图片描述

# 处理米
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()

在这里插入图片描述

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

在这里插入图片描述

# 男生的成绩进行了转化
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)
# 女生成绩,进行转化
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)
score

在这里插入图片描述

data.columns = ['班级', '性别', '姓名', '男1000', '男50米跑', '跳远', '体前屈', '引体', '肺活量', '身高', '体重']
s = score['男1000']
s

在这里插入图片描述

data['男50米跑'] = data['男50米跑'].astype(np.float)
data

在这里插入图片描述

# loc函数:通过行索引 "Index" 中的具体值来取行数据(如取"Index"为"A"的行)
# iloc函数:通过行号来取行数据(如取第二行的数据)
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
data.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(30)

在这里插入图片描述

data.columns
cols = ['班级', '性别', '姓名', '男1000','男1000成绩', '男50米跑', '男50米跑成绩','跳远', '跳远成绩', '体前屈', '体前屈成绩',  '引体', '引体成绩','肺活量',  '肺活量成绩', '身高','体重']
# 根据索引的顺序去DataFrame中取值
data = data[cols]
data.head()
def convert(x):
    if x > 100:
        return x/100
    else:
        return x
data['身高'] = data['身高'].map(convert)
data['BMI'] = (data['体重']/(data['身高'])**2).round(1)
data.head()

在这里插入图片描述

'''≤16.4
23.3~26.3'''
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
    else:
        return 0

data['BMI_score'] = data['BMI'].map(convert_bmi)
data.head(50)

在这里插入图片描述

# 统计分析
# 定义需求,画图,对比分析
(data['BMI_score'].value_counts()).plot(kind = 'pie',autopct = '%0.2f%%')

在这里插入图片描述

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

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值