在实际应用中对于数据进行分析的时候,经常能看见缺失值,下面来介绍一下如何利用pandas来处理缺失值。常见的缺失值处理方式有,过滤、填充。
缺失值的判断
pandas使用浮点值NaN(Not a Number)表示浮点数和非浮点数组中的缺失值,同时python内置None值也会被当作是缺失值。
s = Series(["a","b",np.nan,"c",None]) print(s) ''' 0 a 1 b 2 NaN 3 c 4 None ''' #判断缺失值,如果是则返回True,否则返回False print(s.isnull()) ''' 0 False 1 False 2 True 3 False 4 True ''' #输出缺失值的索引和值 print(s[s.isnull()]) ''' 2 NaN 4 None '''
pandas在运算中会自动忽略缺失值。
a = pd.Series([1,2,np.nan,3,None]) a.sum()6
此外pandas一共提供了4个针对缺失数据进行操作的函数,分别是isnull(),notnull(),dropna(),fillna()。
a.isnull() Out[9]: 0 False1 False2 True3 False4 Truedtype: bool a.notnull() Out[10]: 0 True1 True2 False3 True4 Falsedtype: bool a.dropna() Out[11]: 0 1.01 2.03 3.0dtype: float64
DataFrame的缺失值过滤
DataFrame删除缺失值相对于Series而言就要复杂一些,也许有的时候你是想删除含有缺失值的行或列,也许有时候你需要删除的是,当整行或整列全为缺失值的时候才删除,好在pandas对于这两种情况都有相对应的处理方法。
1、删除含有缺失值的行和列
df.dropna(
axis=0, # 0: 对行进行操作; 1: 对列进行操作
how='any' # 'any': 只要存在 NaN 就 drop 掉; 'all': 必须全部是 NaN 才 drop
)
a = [[1, np.nan, 2],[9,None,np.nan],[3, 4, None],[5,6,7]] data = pd.DataFrame(a) data Out[19]: 0 1 20 1 NaN 2.01 9 NaN NaN2 3 4.0 NaN3 5 6.0 7.0data.dropna() Out[20]: 0 1 23 5 6.0 7.0data.dropna(axis=1) Out[21]: 00 11 92 33 5
2、删除全为缺失值的行和列
a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]] data = pd.DataFrame(a) print(data) 0 1 20 1.0 NaN 2.01 NaN NaN NaN2 3.0 NaN NaN3 5.0 NaN 7.0print(data.dropna(how="all")) 0 1 20 1.0 NaN 2.02 3.0 NaN NaN3 5.0 NaN 7.0print(data.dropna(how="all",axis=1)) 0 20 1.0 2.01 NaN NaN2 3.0 NaN3 5.0 7.0
3.使用thresh控制删除的行数
a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]] data = pd.DataFrame(a) data Out[35]: 0 1 20 1.0 NaN 2.01 NaN NaN NaN2 3.0 NaN NaN3 5.0 NaN 7.0data.dropna(how="all",thresh=3) Out[36]: Empty DataFrame Columns: [0, 1, 2] Index: [] data.dropna(how="all",thresh=1) Out[37]: 0 1 20 1.0 NaN 2.02 3.0 NaN NaN3 5.0 NaN 7.0
df.fillna(value=0)
填充缺失值
数据都是宝贵的,也许有时候你的数据不够多,因为数据越多对于模型的训练,数据分析都是有好处的,所以很多的时候我们都不想删除数据。通常情况下,也许你会选择用一些特殊值来填充缺失值。下面介绍使用pandas的fillna方法来填充缺失数据。
1、指定特殊值填充缺失值
a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]] data = DataFrame(a) print(data) ''' 0 1 2 0 1 2.0 2.0 1 3 NaN 6.0 2 3 7.0 NaN 3 5 NaN 7.0 ''' #用0填充所有的缺失数据 print(data.fillna(0)) ''' 0 1 2 0 1 2.0 2.0 1 3 0.0 6.0 2 3 7.0 0.0 3 5 0.0 7.0 '''
2、不同列使用不同的填充值
a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]] data = DataFrame(a) print(data) ''' 0 1 2 0 1 2.0 2.0 1 3 NaN 6.0 2 3 7.0 NaN 3 5 NaN 7.0 ''' print(data.fillna({1:1,2:2})) ''' 0 1 2 0 1 2.0 2.0 1 3 1.0 6.0 2 3 7.0 2.0 3 5 1.0 7.0 '''
3、前向填充和后向填充
a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]] data = DataFrame(a) print(data) ''' 0 1 2 0 1 2.0 2.0 1 3 NaN 6.0 2 3 7.0 NaN 3 5 NaN 7.0 ''' #前向填充,使用默认是上一行的值,设置axis=1可以使用列进行填充 print(data.fillna(method="ffill")) ''' 0 1 2 0 1 2.0 2.0 1 3 2.0 6.0 2 3 7.0 6.0 3 5 7.0 7.0 ''' #后向填充,使用下一行的值,不存在的时候就不填充 print(data.fillna(method="bfill")) ''' 0 1 2 0 1 2.0 2.0 1 3 7.0 6.0 2 3 7.0 7.0 3 5 NaN 7.0 '''
4、使用列的平均值进行填充
a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]] data = DataFrame(a) print(data) ''' 0 1 2 0 1 2.0 2.0 1 3 NaN 6.0 2 3 7.0 NaN 3 5 NaN 7.0 '''print(data.fillna(data.mean())) ''' 0 1 2 0 1 2.0 2.0 1 3 4.5 6.0 2 3 7.0 5.0 3 5 4.5 7.0 '''
作者:夜神moon
链接:https://www.jianshu.com/p/e8c3c99a5d63