数据预览
数据预处理
通过数据预览,可以做到对数据心中有数。然而,在正式进行数据处理之前,我们必须进行数据预处理,它直接关系到分析结果的准确性。
有些数据会存在缺失值(NaN
)、重复值
-
检测缺失值
-
检测重复值
-
调用**duplicated()**方法,可以用于检测重复值
df.duplicated()
0 False
1 False
2 True
3 False
4 False
5 False
df.duplicated().any()
True
调用duplicated()方法,可以返回某一行是否是重复值。由于第4行和第3行的数据属于重复行,因此返回True。接着使用any()方法,即可判断出数据中存在重复值
-
缺失值处理
-
重复值处理
-
数据替换
-
调用**replace()**方法,可以实现数据替换,例如replace(A,B)
,表示直接将A替换成B
df['数学'] = df['数学'].replace(0,90)
数据选取
数据运算
方法 |
作用 |
方法 |
作用 |
sum() |
求和 |
abs() |
求绝对值 |
count() |
计数 |
mod() |
求余数 |
mean() |
求均值 |
value_counts() |
求每个值出现的个数 |
max() |
求最大值 |
prod() |
求连乘积 |
min() |
求最小值 |
argmax() |
求最大值的索引值 |
mode() |
求众数 |
idxmax() |
求最大值的索引值 |
var() |
求方差 |
argmin() |
求最小值的索引值 |
std() |
求标准差 |
idxmin() |
求最小值的索引值 |
median() |
求中位数 |
unique() |
去重(唯一值) |
-
计算每个人的总成绩
df['总分'] = df['语文'] + df['数学'] + df['英语']
df
姓名 班级 语文 数学 英语 总分
0 赵一 一班 98 96.0 97 291.0
1 王二 一班 88 90.0 75 253.0
2 张三 一班 86 87.0 93 266.0
3 李四 二班 93 92.0 81 266.0
4 朱五 二班 95 99.0 60 254.0
-
如果想计算出每个班级的总人数,应该怎么做
df['班级'].value_counts()
一班 3
二班 2
Name: 班级, dtype:int64
-
计算出每个人的平均分,并保留两位小数
df['平均分']=df['总分'].apply(lambda x: round(x/3,2))
df
姓名 班级 语文 数学 英语 总分 平均分
0 赵一 一班 98 96.0 97 291.0 97.00
1 王二 一班 88 90.0 75 253.0 84.33
2 张三 一班 86 87.0 93 266.0 88.67
3 李四 二班 93 92.0 81 266.0 88.67
4 朱五 二班 95 99.0 60 254.0 84.67
apply()将”总分“这一列的每个元素,都除以3且结果保留两位小数。
相当于
a=[1,2,3,4,5]
c=list(map(lambda x:x-1,a))
print(c)
[0, 1, 2, 3, 4]
-
数据排序与排名
-
数据排序:sort_value()方法可以实现
DataFrame.sort_value(by,ascending,inplace)
by:列名(字符/字符列表)
ascending:是否升序排序,默认为升序:True
inplace:是否修改原DataFrame
-
按照总分降序排序
df.sort_values(by = ["总分"],ascending=False,inplace=True)
df
姓名 班级 语文 数学 英语 总分 平均分
0 赵一 一班 98 96.0 97 291.0 97.00
2 张三 一班 86 87.0 93 266.0 88.67
3 李四 二班 93 92.0 81 266.0 88.67
4 朱五 二班 95 99.0 60 254.0 84.67
1 王二 一班 88 90.0 75 253.0 84.33
###如果总分相同,再按英语来排序
df.sort_values(by = ["总分","英语"],ascending=[False,True],inplace=True)
df
姓名 班级 语文 数学 英语 总分 平均分
0 赵一 一班 98 96.0 97 291.0 97.00
3 李四 二班 93 92.0 81 266.0 88.67
2 张三 一班 86 87.0 93 266.0 88.67
4 朱五 二班 95 99.0 60 254.0 84.67
1 王二 一班 88 90.0 75 253.0 84.33
-
数据排名
-
当我们对数据完成排序后,就可以进行数据排名了。调用rank()方法可以实现。
DataFrame.rank(method,ascending)
method:排序方式
ascending:是否升序排序,默认为True
-
method有5个常用选项
-
first
姓名 |
总分 |
排名 |
赵一 |
291 |
1 |
张三 |
266 |
2 |
李四 |
266 |
3 |
朱五 |
254 |
4 |
王二 |
253 |
5 |
-
average
姓名 |
总分 |
排名 |
赵一 |
291 |
1 |
张三 |
266 |
2.5 |
李四 |
266 |
2.5 |
朱五 |
254 |
4 |
王二 |
253 |
5 |
-
min
姓名 |
总分 |
排名 |
赵一 |
291 |
1 |
张三 |
266 |
2 |
李四 |
266 |
2 |
朱五 |
254 |
4 |
王二 |
253 |
5 |
-
max
姓名 |
总分 |
排名 |
赵一 |
291 |
1 |
张三 |
266 |
3 |
李四 |
266 |
3 |
朱五 |
254 |
4 |
王二 |
253 |
5 |
-
dense
姓名 |
总分 |
排名 |
赵一 |
291 |
1 |
张三 |
266 |
2 |
李四 |
266 |
2 |
朱五 |
254 |
3 |
王二 |
253 |
4 |
-
按照总分来排名
df['排名'] = df['总分'].rank(method='dense',ascending=False).astype('int')
df
姓名 班级 语文 数学 英语 总分 平均分 排名
0 赵一 一班 98 96.0 97 291.0 97.00 1
2 张三 一班 86 87.0 93 266.0 88.67 2
3 李四 二班 93 92.0 81 266.0 88.67 2
4 朱五 二班 95 99.0 60 254.0 84.67 3
1 王二 一班 88 90.0 75 253.0 84.33 4
由于这里返回的排名值是一个浮点型,因此需要调用astype()
方法实现数据类型转换
-
数据合并与连接:用于实现对多表的操作
-
数据分组与透视表
-
通过合并和连接得到的大表,一般用于“数据分组”和“数据透视表”的计算
DataFrame.groupby(by).聚合函数
by:分组依据
-
一般分组和聚合是搭配使用的,分组后调用聚合函数完成聚合操作
函数 |
作用 |
函数 |
作用 |
sum() |
求和 |
median() |
求中位数 |
count() |
计数 |
var() |
求方差 |
mean() |
求平均值 |
std() |
求标准差 |
max() |
求最大值 |
describe() |
计算描述性统计量 |
min() |
求最小值 |
first |
第一次出现的值 |
mode() |
求众数 |
last |
最后一次出现的值 |
-
以班级分组,计算每个班级的学生数量
df_merge = pd.merge(df_concat,df3,how='inner',on='姓名')
df_merge
姓名 班级 语文 数学 英语 性别 住址
0 赵一 一班 98 96.0 97 男 朝阳
1 王二 一班 88 90.0 75 女 朝阳
2 张三 一班 86 87.0 93 男 海淀
3 李四 二班 93 92.0 81 男 海淀
4 朱五 二班 95 99.0 60 女 朝阳
5 马六 三班 86 90 89 女 海淀
6 黄七 三班 96 88 91 男 海淀
df_merge.groupby("班级").count()
姓名 语文 数学 英语 性别 住址
班级
一班 3 3 3 3 3 3
二班 2 2 2 2 2 2
三班 2 2 2 2 2 2
df_merge.groupby("班级")['姓名'].count()
班级
一班 3
二班 2
三班 2
Name:姓名,dtype:int64
调用groupby()
方法并搭配聚合函数count()
,按照班级这列进行分组并对其他列进行计数,统计出每个班级的学生数量,实际上只需要对姓名这列计数就够了。
-
以班级、住址分组
df_merge.groupby(['班级','住址'])['姓名'].count()
班级 住址
一班 朝阳 2
海淀 1
二班 朝阳 1
海淀 1
三班 海淀 2
Name:姓名,dtype:int64
-
以班级分组,计算每个班语文成绩最高的分数
df_merge.group("班级")['语文'].max()
班级
一班 98
二班 96
三班 95
Name:语文,dtype:int64
-
数据透视表:pivot_table()可以实现数据透视表
参数 |
作用 |
data |
相当于Excel中的“选中数据源” |
index |
相当于数据透视表字段中的行 |
columns |
相当于数据透视表字段中的列 |
values |
相当于数据透视表字段中的值 |
aggfunc |
相当于计算类型 |
margins |
相当于结果中的总计 |
margins_name |
相当于修改总计名 |
fill_value |
将缺失值用某个指定值填充 |
-
以住址为行,班级为列,计算每个班级的学生数量,并统计他们的合计值
pd.pivot_table(
df_merge,values="姓名",
columns="班级",index="住址",
aggfunc="count",fill_value=0,
margins_name='合计',margins=True
)
班级 一班 二班 三班 合计
住址
朝阳 2 1 0 3
海淀 1 1 2 4
合计 3 2 2 7
-
Excel拆分与合并
-
按条件将Excel文件拆分到不同的工作簿
import pandas as pd
df = pd.read_excel("三年级总成绩单.xlsx")
for i in df['班级'].unique():
df[df['班级']==i].to_excel(f"{i}.xlsx",index=False)
-
按条件将Excel拆分到不同的工作表
import pandas as pd
df = pd.read_excel("三年级总成绩单.xlsx")
for i in df['班级'].unique():
df[df['班级']==i].to_excel(
"三年级总成绩单.xlsx",index=False,sheet_name=f"{i}"
)
但是执行后发现每次生成的工作表都会覆盖前一个,最终只剩下一个表,用这个方法实现
import pandas as pd
df = pd.read_excel('三年级总成绩单.xlsx')
writer = pd.ExcekWriter("三年级总成绩单.xlsx")
df.to_excel(writer,sheet_name='总成绩',index=False)
for j in df['班级'].unique():
df[df['班级']==j].to_excel(writer,sheet_name=j,index=False)
ExcelWriter()
方法,他会帮助我们建立一个空的容器对象writer
-
批量将不同的工作表合并到一个excel文件
import pandas as pd
sheet_names = pd.ExcelFile("三年级分班成绩单.xlsx").sheet_names
df_all = pd.DataFrame()
for i in sheet_names:
df = pd.read_excel("三年级分班成绩单.xlsx",sheet_name=i)
df_all = df_all.append(df)
df_all.to_excel(
'三年级分班成绩单.xlsx',sheet_name='总成绩'
)
ExcelFile()
会得到一个ExcelFile
对象。该对象有一个很好用的sheet_names属性,它能够获取当前表格中所有工作表的名称,并以一个列表返回
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)