在许多数据分析⼯作中,缺失数据是经常发⽣的。
pandas
的⽬
标之⼀就是尽量轻松地处理缺失数据。例如,
pandas
对象的所
有描述性统计默认都不包括缺失数据。
缺失数据在
pandas
中呈现的⽅式有些不完美,但对于⼤多数⽤
户可以保证功能正常。对于数值数据,
pandas
使⽤浮点值
NaN
(
Not a Number
)表示缺失数据。我们称其为哨兵值,可以
⽅便的检测出来:
import pandas as pd import numpy as np string_data = pd.Series(['aardvark', 'artichoke',np.nan, 'avocado']) print(string_data)
print(string_data.isnull())#用isnull来判断是否为空
OUT:
0 False
1 False
2 True
3 False
dtype: bool
在
pandas
中,我们采⽤了
R
语⾔中的惯⽤法,即将缺失值表示为
NA
,它表示不可⽤
not available
。在统计应⽤中,
NA
数据可能
是不存在的数据或者虽然存在,但是没有观察到(例如,数据采
集中发⽣了问题)。当进⾏数据清洗以进⾏分析时,最好直接对
缺失数据进⾏分析,以判断数据采集的问题或缺失数据可能导致
的偏差。
Python
内置的
None
值在对象数组中也可以作为
NA
:
string_data[0] = None
print( string_data ) print(string_data.isnull())
0 None
1 artichoke
2 NaN
3 avocado
dtype: object
0 True
1 False
2 True
3 False
dtype: bool
pandas
项⽬中还在不断优化内部细节以更好处理缺失数据,像
⽤户
API
功能,例如
pandas.isnull
,去除了许多恼⼈的细节。表
7-1
列出了⼀些关于缺失数据处理的函数。
滤除缺失数据
过滤掉缺失数据的办法有很多种。你可以通过
pandas.isnull
或布
尔索引的⼿⼯⽅法,但
dropna
可能会更实⽤⼀些。对于⼀个
Series
,
dropna
返回⼀个仅含⾮空数据和索引值的
Series
:
from numpy import nan as NA data = pd.Series([1,NA, 3.5,NA,7]) datas = data.dropna() print(datas)
data.dropna() 等价于data[data.notnull()]
⽽对于
DataFrame
对象,事情就有点复杂了。你可能希望丢弃全
NA
或含有
NA
的⾏或列。
dropna
默认丢弃任何含有缺失值的⾏:
原数据:
import pandas as pd from numpy import nan as NA data = pd.DataFrame([[1.,6.5,3.0],[1.0,NA,NA],[NA,NA,NA],[NA,6.5,3.]]) cleaned = data.dropna() print(cleaned)
out:
传⼊
how='all'
将只丢弃值全为
NA
的那些⾏:
data1=data.dropna(how='all') print(data1)
out:
⽤这种⽅式丢弃列,只需传⼊
axis=1
即可:
data2=data.dropna(axis=1, how='all') print(data2)
另⼀个滤除
DataFrame
⾏的问题涉及时间序列数据。假设你只想
留下⼀部分观测数据,可以⽤
thresh
参数实现此⽬的:
df = pd.DataFrame(np.random.randn(7, 3)) df.iloc[:4,1] = NA df.iloc[:2,2]=NA print(df)
df.dropna(thresh=2)
Out[32]:
0 1 2
2 0.092908 NaN 0.769023
3 1.246435 NaN -1.296221
4 0.274992 0.228913 1.352917
5 0.886429 -2.001637 -0.371843
6 1.669025 -0.438570 -0.539741