欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python之数据处理案例

程序员文章站 2024-03-24 21:34:16
...

Python之数据处理案例

1 准备数据

Python之数据处理案例

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

Python之数据处理案例
4 参考文献
《基于Python的大数据分析基础及实战》

相关标签: python