博客文章内需要的文件: 文件
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
缺失值
什么是缺失值
在了解缺失值(也叫控制)如何处理之前,首先要知道的就是什么是缺失值?直观上理解,缺失值表示的是“缺失的数据”。
可以思考一个问题:是什么原因造成的缺失值呢?其实有很多原因,实际生活中可能由于有的数据不全所以导致数据缺失,也有可能由于误操作导致数据缺失,又或者人为地造成数据缺失。
对空缺值的处理:
- 查看和统计
- 处理:删除
- 处理:填充
寻找空值数据
这些缺失值,可以使用 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) # 线性插值填充