学习笔记
进行数据分析和建模,需要准备数据,比如:加载,清理,转换,重新排列
处理缺失值
对于数据型数据,pandas 使用浮点值NaN(Not a Number)
检测是否为空值
string_data.isnull()
pandas 中采用R语言的编程惯例,将缺失值成为NA,意思是not available
统计学应用中,NA数据可以是不存在的数据或者是存在但不可观察的数据
当清洗数据用于数据分析时,对缺失数据本身进行分析以确定数据收集问题或数据丢失导致的数据偏差通常很重要
python内建的None值在对象池数组中也被当作NA处理
NA处理方法
dropna
根据每个标签的值是否是缺失数据来筛选轴标签,并根据允许丢失的数据量来确定阈值
fillna
用某些值填充缺失的数据或使用插值方法(ffill或bfill)
isnull
返回表明哪些值是缺失值的布尔值
notnull
isnull的反函数
过滤缺失值
1.使用pandas.isnull和布尔值索引手动地过滤缺失值
2.dropna过滤缺失值
3.在series上使用dropna,返回series中所有非空数据及其索引值
=============================
import pandas as pd
from numpy import nan as NA
data=pd.Series([1,NA,3.5,NA,7])
data.dropna()
0 1.0
2 3.5
4 7.0
dtype: float64
等同于
data[data.notnull()]
0 1.0
2 3.5
4 7.0
dtype: float64
结果一样
=============================
当处理DataFrame对象时,会更复杂一点,可能想要删除全部为NA或包含有NA的行或列。
dropna默认情况下会删除包含缺失值的行
data=pd.DataFrame([[1,6.5,3],[2,NA,NA],[NA,NA,NA],[NA,6.5,3]])
cleaned=data.dropna()
data
cleaned
清洗后的数据,过滤缺失值
删除所有值均为NA的行,dropna(how=‘all’)
data=pd.DataFrame([[1,6.5,3],[2,NA,NA],[NA,NA,NA],[NA,6.5,3]])
cleaned=data.dropna(how='all')
cleaned
用同样的方式删除列,传入参数,axis=1
dropna(axis=1,how=‘all’)
过滤DataFrame的行相关方法往往涉及时间序列数据,如果只想保留包含一定数据的观察值的行,可以使用thresh参数来表示
import pandas as pd
import numpy as np
df=pd.DataFrame(np.random.randn(7,3))
df.iloc[:4,1]=NA
df.iloc[:2,2]=NA
df
df.dropna(thresh=2)
补全缺失值
多数情况下,使用 fillna 方法来补全缺失值,调用fillna时可以使用一个常数来替代缺失值
df.fillna(0)
调用 fillna 时使用字典,可以为不同列设定不同的填充值
df.fillna({1:0.5,2:0})
fillna 返回一个新的对象,也可以修改已存在的对象
_=df.fillna(0,inplace=True)
df
用于重建索引的相同的插值方法也可以用于 fillna
df=pd.DataFrame(np.random.randn(6,3))
df.iloc[2:,1]=NA
df.iloc[4:,2]=NA
df
df.fillna(method='ffill')
df.fillna(method='ffill',limit=2)
ffill 是向前填充
fillna 还可以将series的平均值或中位数用于填充缺失值
data=pd.Series([1,NA,3.5,NA,7])
data.fillna(data.mean())
0 1.000000
1 3.833333
2 3.500000
3 3.833333
4 7.000000
dtype: float64
fillna 函数参数:
value
标量值或字典型对象用于填充缺失值
method
插值方法,如果没有其他参数,默认时是“ffill"
axis
需要填充的轴,默认为0
inplace
修改被调用的对象,而不是生成一个备份
limit
用于向前或向后填充时最大的填充范围
内容部分引用于《利用Python进行数据分析》第2版(Wes McKinney著,徐敬一译),仅供大家一起学习交流
如有错误,请多指教