1.缺失数据的处理
1.1 搜索缺失值
先读取数据,利用read_csv函数将CSV(comma-separed value,以逗号为分隔符的数值)格式的数据读到pandas的数据框(DataFrame)中。
StringIO函数起到演示作用:如果我们的数据是存储在硬盘上的CSV文件,就可以通过此函数以字符串的方式从文件中读取数据,并将其转换成DataFrame的格式赋值给csv_data。
(注意:StringIO函数来自库io,是用来在内存中读取str的)
代码示例:
import pandas as pd
from io import StringIO
csv_data='''A,B,C,D
1.0,2.0,3.0,4.0
5.0,6.0,,8.0
0.0,11.0,12.0,'''
df=pd.read_csv(StringIO(csv_data))
注意:read_csv函数是在库pandas中的,所以调用的时候要用pandas.read_csv
df
Out[8]:
A B C D
0 1.0 2.0 3.0 4.0
1 5.0 6.0 NaN 8.0
2 0.0 11.0 12.0 NaN
可以直接看到此时的文件中有哪些缺失值,这里用NaN(Not A Number)表示。
对于大的数据框,手工搜索缺失值是及其繁琐的,在此情况下,我们可以使用pandas库中的isnull()函数,isnull()函数返回一个布尔值的DataFrame值,若DataFrame的元素单元包含数字型数值则返回值为假,若数据值缺失则返回值为真。还可以通过sum函数,计算每列中缺失值的数量。
示例代码:
df.isnull().sum()
Out[9]:
A 0
B 0
C 1
D 1
dtype: int64
注意:这里延续前面的例子。这里计算得到每一列的缺失值数量
然后可以用DataFrame的values属性来访问相关的Numpy数组,如下:
df.values
Out[11]:
array([[ 1., 2., 3., 4.],
[ 5., 6., nan, 8.],
[ 0., 11., 12., nan]])
1.2 将存在缺失值的特征或样本删除
利用dropna()函数来删除数据集中包含缺失值的行
df.dropna()
Out[12]:
A B C D
0 1.0 2.0 3.0 4.0
将axis参数设为1,以删除数据集中至少包含一个NaN值的列
df.dropna(axis=1)
Out[13]:
A B
0 1.0 2.0
1 5.0 6.0
2 0.0 11.0
删除所有列为NaN的行
df.dropna(how='all')
Out[14]:
A B C D
0 1.0 2.0 3.0 4.0
1 5.0 6.0 NaN 8.0
2 0.0 11.0 12.0 NaN
删除非NaN值少于4个的行
df.dropna(thresh=4)
Out[15]:
A B C D
0 1.0 2.0 3.0 4.0
删除在特定列出现NaN的行,下面示例选择‘C’列
df.dropna(subset=['C'])
Out[16]:
A B C D
0 1.0 2.0 3.0 4.0
2 0.0 1