pythoh之数据分析pandas(6)
python之数据分析Pandas(6)
前言
今天我们来学习一下pandas中对缺失值的处理,包括isnull、notnull、dropna、fillna
等等。
开始
isnull 和 notnull
我们使用read_excel来读取表格并且对其进行一些操作。
studf = pd.read_excel("./datas/student_excel/student_excel.xlsx", skiprows=2)
studf
# 读取出来的数据
Unnamed: 0 姓名 科目 分数
0 NaN 小明 语文 85.0
1 NaN NaN 数学 80.0
2 NaN NaN 英语 90.0
3 NaN NaN NaN NaN
4 NaN 小王 语文 85.0
5 NaN NaN 数学 NaN
6 NaN NaN 英语 90.0
7 NaN NaN NaN NaN
8 NaN 小刚 语文 85.0
9 NaN NaN 数学 80.0
10 NaN NaN 英语 90.0
这个读取表格后面的skipprows是去掉空行的操作,在表格中也许有一些没有用的空行,我们可以指定去掉几行空行。在我们读取完毕之后,输出一个DataFrame表格,并且去掉了原来的1、2行,同时我们在读取的过程中,如果表格中有些数据没有,就会用NaN代替,表示此处没有数据。
这个是表格中原有的数据
首先,我们使用isnull检测是否为空值,这个方法回返回一个Boolean值,如果是空值则返回True,如果不是则返回False,同样是在DataFrame表格中展示。
studf.isnull()
# 输出的结果。
Unnamed: 0 姓名 科目 分数
0 True False False False
1 True True False False
2 True True False False
3 True True True True
4 True False False False
5 True True False True
6 True True False False
7 True True True True
8 True False False False
9 True True False False
10 True True False False
这个表格和上面输出的刚好对应,我们除了一次性处理空值,也可以进行单独判断,返回的是一个Series类型。同样通过Boolean反馈。
studf["分数"].isnull()
# 输出的结果
0 False
1 False
2 False
3 True
4 False
5 True
6 False
7 True
8 False
9 False
10 False
Name: 分数, dtype: bool
isnull()函数判断是否为空值,而notnull()函数则和它相反,如果是空值则返回False,如果不是空值则返回True。用法是一样的。同样我们还可以结合oc()函数进行一些更加高级的操作。
studf.loc[studf["分数"].notnull(), :] # 筛选没有空分数的所有行
Unnamed: 0 姓名 科目 分数
0 NaN 小明 语文 85.0
1 NaN NaN 数学 80.0
2 NaN NaN 英语 90.0
4 NaN 小王 语文 85.0
6 NaN NaN 英语 90.0
8 NaN 小刚 语文 85.0
9 NaN NaN 数学 80.0
10 NaN NaN 英语 90.0
这个loc()函数先进行查询,然后里面判断【分数】这个列的每这个值是不是空值,如果不是空值,就返回True,符合要求输出。是空值就不会加入要整合的队列中。所以和上面的相比少了几行。
dropna
Pandas为我们提供了dropna()函数对空值进行删除,可以删除空值所对应的行,也可以删除对应的列,只要我们进行参数的约束就好。
studf.dropna(axis="columns", how='all', inplace=True) #删除都为空值所对应的列
姓名 科目 分数
0 小明 语文 85.0
1 NaN 数学 80.0
2 NaN 英语 90.0
3 NaN NaN NaN
4 小王 语文 85.0
5 NaN 数学 NaN
6 NaN 英语 90.0
7 NaN NaN NaN
8 小刚 语文 85.0
9 NaN 数学 80.0
10 NaN 英语 90.0
- axis : 删除行还是列,{0 or ‘index’, 1 or ‘columns’}, default 0
- how :如果等于any则任何值为空都删除,如果等于all则所有值都为空才删除
- inplace : 如果为True则修改当前df,否则返回新的df
因为之前的第一列都为空值,因此第一列就被无情的删除了,但是别的列因为不是所有的值都为空值,所以保存下来了。如果把axis改为等于index,就是删除行了,其他操做是一样的。
fillna
学完了删除,当然还要学习填充了,Pandas的fillna()函数就给我们提供了这一便利。
studf.fillna({"分数":0}) #把分数这列为空值的地方填充为0
# 等同于
studf.loc[:, '分数'] = studf['分数'].fillna(0) #查询分数空值的覆盖写入
# 输出
姓名 科目 分数
0 小明 语文 85.0
1 NaN 数学 80.0
2 NaN 英语 90.0
4 小王 语文 85.0
5 NaN 数学 0.0
6 NaN 英语 90.0
8 小刚 语文 85.0
9 NaN 数学 80.0
10 NaN 英语 90.0
我们还可以选择填充空值前后的数值给空值。
- value:用于填充的值,可以是单个值,或者字典(key是列名,value是值)
- method :等于ffill使用前一个不为空的值填充forword fill;等于bfill使用后一个不为空的值填充backword fill
- axis: 按行还是列填充,{0 or ‘index’, 1 or ‘columns’}
- inplace :如果为True则修改当前df,否则返回新的df
# 使用前面的有效值填充,用ffill:forward fill
studf.loc[:, '姓名'] = studf['姓名'].fillna(method="ffill")
姓名 科目 分数
0 小明 语文 85.0
1 小明 数学 80.0
2 小明 英语 90.0
4 小王 语文 85.0
5 小王 数学 0.0
6 小王 英语 90.0
8 小刚 语文 85.0
9 小刚 数学 80.0
10 小刚 英语 90.0
这个方法就是把姓名这一列中,含有空值的进行copy,而copy的就是这个空值前面的值。如果使用bfill就是copy空值后面的值。大家可以尝试一下。当我们把数据清洗完毕后,我们就可以用to_excel()把弄好的数据给存到表格中去了。
结尾
今天学习的就是这些,多多指教,共同进步。
本文地址:https://blog.csdn.net/qq_42909511/article/details/107364397
上一篇: 浅谈Redis五个对象类型的底层原理
下一篇: xml 文件操作