做数据分析挖掘特征之前,都要先处理好数据,数据处理里第一步我们要先处理有缺失值的情况。
查看导入的数据缺失情况:
1 import pandas as pd 2 from io import StringIO 3 4 csv_data = """A,B,C,D 5 1.0,2.0,3.0,4.0 6 5.0,6.0,,8.0 7 0.0,11.0,12.0, 8 """ 9 df = pd.read_csv(StringIO(csv_data)) 10 print(df) 11 # 输出缺失值的个数 12 missing = df.isnull().sum() 13 print(missing) 14 print(missing.values, type(missing.values)) 15 print(missing.values[1:]) # 可以索引取值,但是不是列表,方法属性不一样 16 print(dir(missing.values))
通过打印的输出我们可以发现使用 isnull方法可以判断值是否为空,isnull().sum()方法按列输出缺失值的个数。
我们可以利用数据框(DataFrame)的values属性来获取对应的NumPy数组。
删除有缺失值的行或列:
1 print(df.dropna()) # 按行删除有缺失值 2 print(df.dropna(axis=1)) # 删除列中有缺失值的列 3 print(df.dropna(how="all")) # 删除那些行全是缺失值的 4 print(df.dropna(thresh=4)) # 删除那些没有4个值的行 5 print(df.dropna(subset=["C"])) # 删除缺失值出现在列标为"C"的行
缺失数据填充:
1 from sklearn.preprocessing import Imputer 2 3 imr = Imputer(missing_values='NaN', strategy='mean', axis=0) 4 imr = imr.fit(df) 5 imputed_data = imr.transform(df.values) 6 print(imputed_data)
修改之后的结果:
注意这里是按列求和再除值的个数,你也可以设置 axis=1 按行插补。