缺失数据(missing data)大部分数据分析应用中非常常见。pd设计目标之一就是让缺失数据的处理任务尽量轻松。
pd 使用浮点值NaN(Not a Number) 表示浮点和非浮点数组中的缺失数据。是一个被检测出来的标识
import pandas as pd import numpy as np string_data = pd.Series([‘aardvark‘, ‘artichoke‘, np.nan, ‘avocado‘]) string_data string_data.isnull() #内置的None值也会被当作Na处理 string_data[0] = None string_data.isnull() Out[180]: 0 True1 False2 True3 Falsedtype: bool
Na处理方法
""" =====Na处理方法========= dropna 根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阀值调节对缺失值的容忍度 fillna 用指定值或插值方法填充缺失数据 isnull 返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值,该对象的类型与源类型一样 notnull isnull的否定式 """
1、 滤除缺失数据
#dropna 返回一个仅含非空数据和索引值的Series from numpy import nan as NA data = pd.Series([1, NA, 3.5, NA, 7]) data.dropna() Out[183]: 0 1.02 3.54 7.0dtype: float64 #也可以通过布尔型索引达到这个目标data[data.notnull()]
#对于dataFrame,dropna默认丢弃任何含有缺失值的行 data = pd.DataFrame([[1., 6.5, 3], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3]]) cleaned = data.dropna() dataOut[187]: 0 1 20 1.0 6.5 3.01 1.0 NaN NaN2 NaN NaN NaN3 NaN 6.5 3.0 cleanedOut[188]: 0 1 20 1.0 6.5 3.0
data.dropna(how = ‘all‘)Out[189]: 0 1 2 0 1.0 6.5 3.0 1 1.0 NaN NaN 3 NaN 6.5 3.0
只用这种方式丢弃列,只需传入axis =1 即可
#只用这种方式丢弃列,只需传入axis =1 即可 data[4] = NA data data.dropna(axis = 1, how = ‘all‘)
另一个滤除DF的行问题涉及时间序列数据,假设你只想留下一部分预测数据,可以用thresh参数实现些目的
df = pd.DataFrame(np.random.randn(7, 3)) df df.ix[:4, 1] = NA; df.ix[:2, 2] = NAOut[195]: 0 1 20 -1.391379 NaN NaN1 0.283693 NaN NaN2 -1.256739 NaN NaN3 -0.279809 NaN 0.5118984 -2.942845 NaN -0.9386935 1.478454 -1.869872 -1.8155666 -1.001717 -0.074136 -1.132250 df.dropna(thresh = 3)Out[196]: 0 1 25 1.478454 -1.869872 -1.8155666 -1.001717 -0.074136 -1.132250
2、 填充缺失 数据
fillna方法是最主要的函数,通过一个常数调用fillna就会将缺失值替换为那个常数值
df.fillna(0) Out[197]: 0 1 2 0 -1.391379 0.000000 0.000000 1 0.283693 0.000000 0.000000 2 -1.256739 0.000000 0.000000 3 -0.279809 0.000000 0.511898 4 -2.942845 0.000000 -0.938693 5 1.478454 -1.869872 -1.815566 6 -1.001717 -0.074136 -1.132250
#若是通过一个字典调用fillna, 就可以实现对不同的列填充不同的值 df.fillna({1: 0.5, 3: -1})
Out[198]: 0 1 2 0 -1.391379 0.500000 NaN 1 0.283693 0.500000 NaN 2 -1.256739 0.500000 NaN 3 -0.279809 0.500000 0.511898 4 -2.942845 0.500000 -0.938693 5 1.478454 -1.869872 -1.815566 6 -1.001717 -0.074136 -1.132250
#fillna默认会返回新对象,但也可以对现有对象进行就地修改 #总是返回被填充对象的引用_ = df.fillna(0, inplace = True) df
Out[200]: 0 1 2 0 -1.391379 0.000000 0.000000 1 0.283693 0.000000 0.000000 2 -1.256739 0.000000 0.000000 3 -0.279809 0.000000 0.511898 4 -2.942845 0.000000 -0.938693 5 1.478454 -1.869872 -1.815566 6 -1.001717 -0.074136 -1.132250
对reindex有效的那些插值方法也可用于fillna
df = pd.DataFrame(np.random.randn(6, 3)) df.ix[2:, 1] = NA; df.ix[4:, 2] = NA df Out[204]: 0 1 20 1.498980 -0.048566 1.4065541 1.143778 -0.370818 1.3335252 -2.557671 NaN 0.4191883 -0.648393 NaN -0.1591034 0.794345 NaN NaN5 1.814522 NaN NaN #ffill 向前填充值#bfill 向后填充值 df.fillna(method = ‘ffill‘) Out[205]: 0 1 20 1.498980 -0.048566 1.4065541 1.143778 -0.370818 1.3335252 -2.557671 -0.370818 0.4191883 -0.648393 -0.370818 -0.1591034 0.794345 -0.370818 -0.1591035 1.814522 -0.370818 -0.159103 #可填充最大标识量为2 df.fillna(method = ‘ffill‘, limit =2) Out[206]: 0 1 20 1.498980 -0.048566 1.4065541 1.143778 -0.370818 1.3335252 -2.557671 -0.370818 0.4191883 -0.648393 -0.370818 -0.1591034 0.794345 NaN -0.1591035 1.814522 NaN -0.159103
#均值或中位数填充 data = pd.Series([1., NA, 3.5, NA, 7]) data data.fillna(data.mean()) Out[215]: 0 1.0000001 3.8333332 3.5000003 3.8333334 7.000000dtype: float64
"""=====fillna函数的参数======value 用于填充缺失值的标量值或字典对象method 插值方式,如果函数调用时未指定其他参数的话,默认为ffillaxis 待填充的轴,默认axis = 0inplace 修改调用者对象而不产生副本,True为就地修改limit (对于前向和后台填充)可以连续填充的最大数量 """
时间: 2024-11-07 07:17:33