Bootstrap

Python之数据处理案例

Python之数据处理案例

1 准备数据

在这里插入图片描述

2 要求

(1)将数据表添加两列:每位同学的各科成绩总分(score)和每位同学的整体情况(类别),类别按照[df.score.min()-1,400,450,df.score.max()+1]分为“一般” “较好” “优秀”三种情况。

(2)由于“军训 ”这门课的成绩与其他科目成绩差异较大,并且给分较为随意,为了避免给同学评定奖学金带来不公平,请将每位同学的各科成绩标准化,再汇总,并标出“一般” “较好” “优秀”三种类别。

3 代码实现

1、导入数据,并查看数据的“形状”

import pandas as pd
df=pd.read_excel(r'C:\Users\70464\Desktop\4.6带你飞-学习成绩.xls')
df.shape
(21, 9)

2、对数据进行查找重复操作

df.duplicated().tail()
16    False
17    False
18    False
19    False
20     True
dtype: bool
df[df.duplicated()]
   学号 姓名 性别 英语 体育 军训 数分 高代 解几
20 1006 egg  男  60   50   89   71  76   71
df1=df.drop_duplicates()
df1.shape
(20, 9)

3、查看空数据

#查看空值返回的是逻辑真、假数据矩阵,为了方便,取后5行显示
df.isnull().tail() 
df1.isnull().any()  #判断哪些列存在缺省值
学号    False
姓名    False
性别    False
英语    False
体育    False
军训     True
数分    False
高代    False
解几    False
dtype: bool
df1[df1.isnull().values==True] #显示存在缺省值的行
df2 = df1.fillna(0) # 将空数据填充为0
df2.tail(8) #查看后8行数据

4、处理数据中的空格

​ 空格会影响我们后续数据的统计和计算。去除空格的方法有三种:第一种是去除数据两边的空格(str.strip),第二种是单独去除左边的空格(str.lstrip),第三种是单独去除右边的空格(str.rstrip)。代码如下:

df0 = df2.copy() # 为了数据安全先复制一遍
df0['解几'] = df2['解几'].astype(str).map(str.strip)

5、查看列数据类型

​ 查看数据框各列中的数据类型,是否是int,若不是则需要处理。对于数据类型不一致的列抛出列名,以便进一步对此列数据进行处理。

for i in list(df0.columns):
    if df0[i].dtype=='O':   #若某列全部是int,则显示该列为int类型,否则为object
        print(i)
姓名
性别
体育
军训
解几
#查看“解几”列的数据类型为object
df0['解几'].dtype 
dtype('O')
df0['解几'] = df2['解几'].astype(int) #将“解几”列转换为int
df0['解几'].dtype #查看“解几”列的数据类型为int
dtype('int32')

6、以0值填充非int型数据

​ 以“体育”列为例,将“体育”列中的值进行遍历,若不是int格式,就替换为0,并显示其行号。

ty = list(df0.体育)
j=0
for i in ty:
    if type(i) != int:
        print('第'+str(ty.index(i))+'行有非int数据:',i)
        ty[j]=0
    j =j+19行有非int数据: 作弊
ty  #查看index=9的行数据“作弊”是否替换成了0
[78, 91, 81, 50, 88, 50, 6, 79, 67, 0, 90, 67, 71, 74, 80, 72, 76, 96, 74, 60]
df0['体育'] = ty  #再将替换过的ty放回原df0列中
jx = list(df0.军训)
k=0
for i in jx:
    if type(i) != int:
        print('第'+str(jx.index(i))+'行有非int数据:',i)
        jx[k] = 0
    k = k+1
    df0['军训'] = jx
第12行有非int数据:缺考
df0

7、对问题1的处理

​ 下面可以对该数据框进行统计了。先计算每位同学的总分,再排出“一般” “较好” “优秀”三种类别。

df3 = df0.copy()
df3['score']=df3.英语+df3.体育+df3.军训+df3.数分+df3.高代+df3.解几
df3.score.describe()

count     20.000000
mean     410.500000
std       38.051904
min      354.000000
25%      370.750000
50%      416.000000
75%      446.250000
max      457.000000
Name: score, dtype: float64
# 分组的区域划分
bins = [df3.score.min()-1,400,450,df3.score.max()+1]
label = ["一般","较好","优秀"]
df4 = pd.cut(df3.score,bins,right=False,labels=label)
df3['类别'] = df4
df3

8、对问题2的处理

​ 基于问题1的方法,这一步主要是把清洗干净的数据df0的每列数据进行标准化,之后继续使用问题1的方法即可。

for i in list(df0.columns[3:]):
    df0[i]=(df0[i]-df0[i].min())/(df0[i].max()-df0[i].min())
df0.tail()
df0['score']=df0.英语+df0.体育+df0.军训+df0.数分+df0.高代+df0.解几
 # 查看score的最大、最小值以及总记录数等信息
df0.score.describe()
count    20.000000
mean      3.863515
std       0.681950
min       2.536788
25%       3.487306
50%       3.773113
75%       4.431060
max       5.112427
Name: score, dtype: float64
bins=[df0.score.min()-1,3,4,df0.score.max()+1]
label = ["一般","较好","优秀"]
df_0 = pd.cut(df0.score,bins,right=False,labels=label)
# 在df0中增加一列“类别”,用df_0赋值
df0['类别']=df_0
df0

在这里插入图片描述
4 参考文献
《基于Python的大数据分析基础及实战》

;