pandas基础--缺失数据处理

一下代码的前提:import pandas as p

缺失数据是数据分析中的常见现象。pandas使用浮点值NaN(Not a Number)表示浮点和非浮点数组中的缺失数据。它只是一个便于被检测出来的标记而已。python内置的None值也会被当作NA处理。

 1 >>> string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
 2 >>> string_data
 3 0     aardvark
 4 1    artichoke
 5 2          NaN
 6 3      avocado
 7 dtype: object
 8 >>> string_data.isnull()
 9 0    False
10 1    False
11 2     True
12 3    False
13 dtype: bool
14 >>> string_data[0] = None
15 >>> string_data.isnull()  
16 0     True
17 1    False
18 2     True
19 3    False
20 dtype: bool
21 >>>

NA处理方法。

方式

说明

dropna

根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度

fillna

用指定值或插值方法(如ffill或bfill)填充缺失数据

isnull

返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值NA,该对象的类型和源类型一样

notnull

isnull的否定式

1.1 滤除缺失数据

过滤掉缺失数据的方法有多种,可通过dropna实现。

 1 >>> from numpy import nan as NA
 2 >>> data = pd.Series([1, NA, 3.5, NA, 7]) 
 3 >>> data.dropna()
 4 0    1.0
 5 2    3.5
 6 4    7.0
 7 dtype: float64
 8 >>> data[data.isnull()] 
 9 1   NaN
10 3   NaN
11 dtype: float64
12 >>> data[data.notnull()] 
13 0    1.0
14 2    3.5
15 4    7.0
16 dtype: float64

对于DataFrame,可能希望丢弃全NA或含有NA的行或列。

 1 >>> data = pd.DataFrame([[1, 1.6, 3], [1, NA, NA], [NA, NA, NA], [NA, 6.5, 3]]) 
 2 >>> data
 3      0    1    2
 4 0  1.0  1.6  3.0
 5 1  1.0  NaN  NaN
 6 2  NaN  NaN  NaN
 7 3  NaN  6.5  3.0
 8 >>>
 9 >>> cleaned = data.dropna()  #默认丢弃任何含有缺失值的行
10 >>> cleaned
11      0    1    2
12 0  1.0  1.6  3.0
13 >>> data.dropna(how='all')  #只丢弃全为NA的行
14      0    1    2
15 0  1.0  1.6  3.0
16 1  1.0  NaN  NaN
17 3  NaN  6.5  3.0
18 >>> data[4] = NA
19 >>> data
20      0    1    2   4
21 0  1.0  1.6  3.0 NaN
22 1  1.0  NaN  NaN NaN
23 2  NaN  NaN  NaN NaN
24 3  NaN  6.5  3.0 NaN
25 >>> data.dropna(axis=1, how='all')  #丢弃列
26      0    1    2
27 0  1.0  1.6  3.0
28 1  1.0  NaN  NaN
29 2  NaN  NaN  NaN
30 3  NaN  6.5  3.0
31 >>>

另一个滤除DataFrame行的问题涉及到时间序列数据。如果只想留下一部分观测数据,可以用thresh参数实现。

 1 >>> df = pd.DataFrame(np.random.randn(7, 3)) 
 2 >>> df 
 3           0         1         2
 4 0  0.752301  1.360969 -0.474561
 5 1  0.466749  0.563536  1.978575
 6 2  0.223606  0.414722  0.094315
 7 3 -1.687511 -0.116227  0.442363
 8 4  0.705580 -0.131169 -0.868425
 9 5 -0.158964 -0.164512 -0.937150
10 6 -0.281537 -1.579942 -0.562886
11 >>> df.loc[:4, 1] = NA
12 >>> df.loc[:2, 2] = NA 
13 >>> df
14           0         1         2
15 0  0.752301       NaN       NaN
16 1  0.466749       NaN       NaN
17 2  0.223606       NaN       NaN
18 3 -1.687511       NaN  0.442363
19 4  0.705580       NaN -0.868425
20 5 -0.158964 -0.164512 -0.937150
21 6 -0.281537 -1.579942 -0.562886
22 >>> df.dropna(thresh=3)
23           0         1         2
24 5 -0.158964 -0.164512 -0.937150
25 6 -0.281537 -1.579942 -0.562886
26 >>>

1.2  填充缺失数据

fillna方法可实现将缺失值替换为一个常数值。

 1 >>> df 
 2           0         1         2
 3 0  0.752301       NaN       NaN
 4 1  0.466749       NaN       NaN
 5 2  0.223606       NaN       NaN
 6 3 -1.687511       NaN  0.442363
 7 4  0.705580       NaN -0.868425
 8 5 -0.158964 -0.164512 -0.937150
 9 6 -0.281537 -1.579942 -0.562886
10 >>> df.fillna(0) 
11           0         1         2
12 0  0.752301  0.000000  0.000000
13 1  0.466749  0.000000  0.000000
14 2  0.223606  0.000000  0.000000
15 3 -1.687511  0.000000  0.442363
16 4  0.705580  0.000000 -0.868425
17 5 -0.158964 -0.164512 -0.937150
18 6 -0.281537 -1.579942 -0.562886
19 >>> df.fillna({1:0.5, 3:-1})  #第1列的NA替换为0.5,第3列的NA替换为-1
20           0         1         2
21 0  0.752301  0.500000       NaN
22 1  0.466749  0.500000       NaN
23 2  0.223606  0.500000       NaN
24 3 -1.687511  0.500000  0.442363
25 4  0.705580  0.500000 -0.868425
26 5 -0.158964 -0.164512 -0.937150
27 6 -0.281537 -1.579942 -0.562886
28 >>>

fillna默认会返回新对象。但也可以对现有对象进行就地修改。

 1 >>> _ = df.fillna(0, inplace=True) 
 2 >>> df
 3           0         1         2
 4 0  0.752301  0.000000  0.000000
 5 1  0.466749  0.000000  0.000000
 6 2  0.223606  0.000000  0.000000
 7 3 -1.687511  0.000000  0.442363
 8 4  0.705580  0.000000 -0.868425
 9 5 -0.158964 -0.164512 -0.937150
10 6 -0.281537 -1.579942 -0.562886
11 >>>

对reindex有效的插值方法也可以用于fillna。

 1 >>> df = pd.DataFrame(np.random.randn(6, 3))
 2 >>> df.loc[2:, 1] = NA
 3 >>> df.loc[4:, 2] = NA 
 4 >>> df
 5           0         1         2
 6 0 -1.433489  0.162951 -0.664600
 7 1  0.033722 -0.478252  0.480072
 8 2 -0.000977       NaN -1.555649
 9 3 -0.947501       NaN  0.089918
10 4  1.360481       NaN       NaN
11 5 -0.966030       NaN       NaN
12 >>> df.fillna(method='ffill')
13           0         1         2
14 0 -1.433489  0.162951 -0.664600
15 1  0.033722 -0.478252  0.480072
16 2 -0.000977 -0.478252 -1.555649
17 3 -0.947501 -0.478252  0.089918
18 4  1.360481 -0.478252  0.089918
19 5 -0.966030 -0.478252  0.089918
20 >>> df.fillna(method='ffill', limit=2) 
21           0         1         2
22 0 -1.433489  0.162951 -0.664600
23 1  0.033722 -0.478252  0.480072
24 2 -0.000977 -0.478252 -1.555649
25 3 -0.947501 -0.478252  0.089918
26 4  1.360481       NaN  0.089918
27 5 -0.966030       NaN  0.089918

下表是fillna的参数参考。

参数

说明

value

用于填充缺失值的标量值或字典对象

method

插值方式,如果函数调用时未指定其他参数的话,默认为“ffill”

axis

带填充的轴,默认为axis=0

limit

(对于向前或先后填充)可以连续填充的最大数量

原文地址:https://www.cnblogs.com/mrlayfolk/p/12256474.html