Python-pandas{缺失值处理}

  博客文章内需要的文件: 文件

 pandas学习路线:

Python-Pandas{数据结构与基本功能
Python-Pandas{描述与统计功能}
Python-pandas{缺失值处理}
Python-pandas{文本数据处理}
Python-pandas{数据分组}
  大家在学习这一部分后,下载文件后,先将文件导入

import numpy as np
import pandas as pd
grade  = pd.read_csv('student_grade_empty.txt',sep='\t')
grade

在这里插入图片描述

缺失值

什么是缺失值

  在了解缺失值(也叫控制)如何处理之前,首先要知道的就是什么是缺失值?直观上理解,缺失值表示的是“缺失的数据”。

   可以思考一个问题:是什么原因造成的缺失值呢?其实有很多原因,实际生活中可能由于有的数据不全所以导致数据缺失,也有可能由于误操作导致数据缺失,又或者人为地造成数据缺失。

   对空缺值的处理:

  1. 查看和统计
  2. 处理:删除
  3. 处理:填充

寻找空值数据

  这些缺失值,可以使用 isnull()notnull()方法来操作。

grade.isnull() # 空值为Ture

在这里插入图片描述

grade.notnull()  # 空值为False

在这里插入图片描述

# 只显示 姓名列 为空的行
grade[grade.姓名.isnull()]

在这里插入图片描述

# 只查看空值

grade.isnull().sum(axis = 1).astype('bool') # 判断出每一行的NULL值,sum结果为1的说明此行有NULL值,转换类型为 BOOL类型


# 有几个True就代表有几个空值, 布尔当做数学运算, False,自动当做0 ,True自动当做1
grade[grade.isnull().sum(axis = 1).astype('bool')]

在这里插入图片描述

统计空缺值

# 查看数据结构
grade.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 68 entries, 0 to 67
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   姓名      66 non-null     object 
 1   语文      59 non-null     float64
 2   数学      66 non-null     float64
 3   英语      63 non-null     float64
 4   总分      63 non-null     float64
 5   班名次     67 non-null     float64
dtypes: float64(5), object(1)
memory usage: 3.3+ KB
'''
# 这样的方式 我们知道空值有多少,但是需要自己计算

# 有几个True就代表有几个空值, 布尔当做数学运算, False,自动当做0 ,True自动当做1
grade.isnull().sum()
'''
姓名     2
语文     9
数学     2
英语     5
总分     5
班名次    1
dtype: int64
'''

丢弃缺失值

  既然有缺失值了,常见的一种处理办法就是丢弃缺失值。使用 dropna 方法可以丢弃缺失值。

  user_info.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

Seriese 使用 dropna 比较简单,对于 DataFrame 来说,可以设置更多的参数。

  • axis 参数用于控制行或列,跟其他不一样的是,axis=0 (默认)表示操作行,axis=1 表示操作列。
  • how 参数可选的值为 any(默认) 或者 all。any 表示一行/列有任意元素为空时即丢弃,all 一行/列所有值都为空时才丢弃。
  • subset 参数表示删除时只考虑的索引或列名。
  • thresh参数的类型为整数,它的作用是,比如 thresh=3,会在一行/列中至少有 3 个非空值时将其保留。

 这里就不截图结果了,建议大家自行运行

# 默认 只要一行数据,有空值存在,则删除掉
grade.dropna()


# 如果姓名为空就删除
grade.dropna(subset=['姓名'])


# 三列有空值就删除
grade.dropna(subset=['语文','数学','英语'])


 # 一行数据必须有5个以上有效值,才能够保留
grade.dropna(thresh=5) 


# 有这样一种情况,表中的一列数据,一半以上都是空值,其实这一列数据,并没有存在的意义了
# 判断,如果一列数据当中,有效值不足50%,则删除掉
# 人为的去生成空值
grade.loc[30: , '总分'] = np.nan
grade.isnull().sum()
'''
姓名      2
语文      9
数学      2
英语      5
总分     40
班名次     1
dtype: int64
'''
# 不足50%的 总分列被删除掉
grade.dropna(axis=1 , thresh= grade.shape[0] * 0.5)

填充缺失值

  除了可以丢弃缺失值外,也可以填充缺失值,最常见的是使用 fillna 完成填充。

固定值填充

  填充缺失值时,常见的一种方式是使用一个标量来填充。例如,这里样本有缺失的年龄都填充为 0。可以支持DataFrame填充 也可以支持Series填充

# 参数 value=None, 直接用某一个值填充
grade.fillna(0).head(50)

# 采用语文的均值填充
grade.语文.fillna( grade.语文.mean() )

# 采用语文的中位数填充
grade.语文.fillna( grade.语文.median())

grade.语文.median()  # 返回的一个数
'''
109.0
'''
grade.语文.mode() # 但是众数返回的一个series
'''
0    116.0
dtype: float64
'''
# 众数
grade.语文.mode()[0] # 要提取出 116.0
grade.语文.fillna( grade.语文.mode()[0] )


# 三列都采用中位数进行填充
for name in grade[['语文','数学','英语']]:
    print(name) # 得到的是列名
    grade[name].fillna( grade[name].median(), inplace=True)

上下文填充

  除了可以使用标量来填充之外,还可以使用前一个或后一个有效值来填充。设置参数 method='pad'method='ffill' 可以使用前一个有效值来填充。

grade.语文.fillna(method='ffill')# 上面一个有效值填充
grade.语文.fillna(method='bfill',).head(10)# 下面一个有效值填充

  除了通过 fillna 方法来填充缺失值外,还可以通过 interpolate 方法来填充。默认情况下使用线性差值,可以是设置 method 参数来改变方式。

grade.interpolate().head(10) # 线性插值填充
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值