根据菜菜的课程进行整理,方便记忆理解
代码位置如下:
缺失值
数据预处理中非常重要的一项就是处理缺失值
# 处理缺失值impute.SimpleImputer
import pandas as pd
data = pd.read_csv("Narrativedata.csv",index_col = 0)
data.head()
# 我们通过info()可以观察到 Age 和 Embarked的存在缺失值
data.info()
"""
<class 'pandas.core.frame.DataFrame'>
Int64Index: 891 entries, 0 to 890
Data columns (total 4 columns):
Age 714 non-null float64
Sex 891 non-null object
Embarked 889 non-null object
Survived 891 non-null object
dtypes: float64(1), object(3)
memory usage: 34.8+ KB
"""
复制代码
在这里,我们使用从泰坦尼克号提取出来的数据,这个数据有三个特征,一个数值型,两个字符型,标签也是字符型。从这里开始,我们就使用这个数据给大家作为例子,让大家慢慢熟悉sklearn中数据预处理的各种方式。
impute.SimpleImputer
class sklearn.impute.SimpleImputer (
missing_values
=nan,strategy
=’mean’,fill_value
=None, verbose=0,copy=True)
参数
参数 | 含义&输入 |
---|---|
missing_values | 告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan |
strategy | 我们填补缺失值的策略,默认均值。 输入“mean”使用均值填补(仅对数值型特征可用) 输入“median"用中值填补(仅对数值型特征可用) 输入"most_frequent”用众数填补(对数值型和字符型特征都可用) 输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用) |
fill_value | 当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0 |
copy | 默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。 |
- 我们的输入数据必须是二维,reshape(-1,1) 升维
# 在这reshape的目的是因为我们的fit必须是二维的数据
age = data.loc[:,"Age"].values.reshape(-1,1)
age[:20]
"""
array([[22.],
[38.],
[26.],
[35.],
[35.],
[nan],
[54.],
[ 2.],
[27.],
[14.],
[ 4.],
[58.],
[20.],
[39.],
[14.],
[55.],
[ 2.],
[nan],
[31.],
[nan]])
"""
复制代码
- 使用0,中位数,平均数进行填补
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() # 默认使用平均值进行填补
imp_median = SimpleImputer(strategy="median") # 中值填补
imp_0 = SimpleImputer(strategy="constant",fill_value=0) # 使用常数0进行填补
imp_mean = imp_mean.fit_transform(age)
imp_median = imp_median.fit_transform(age)
imp_0 = imp_0.fit_transform(age)
imp_mean[:20]
"""
array([[22. ],
[38. ],
[26. ],
[35. ],
[35. ],
[29.69911765],
[54. ],
[ 2. ],
[27. ],
[14. ],
[ 4. ],
[58. ],
[20. ],
[39. ],
[14. ],
[55. ],
[ 2. ],
[29.69911765],
[31. ],
[29.69911765]])
"""
# 数据不进行展示了
imp_median[:20]
imp_0[:20]
复制代码
- 进行填补
# 进行填补
data.loc[:,"Age"] = imp_median
data.info()
复制代码
- 使用众数填充Embarked
# 使用众数填充Embarked
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy = "most_frequent")
data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)
data.info()
复制代码
用Pandas和Numpy进行填补其实更加简单
- 主要使用的是fill_na和drop_na
# 我们可以使用pandas和numpy对数据进行填充
import pandas as pd
data = pd.read_csv("Narrativedata.csv",index_col = 0)
data.head()
# 使用fillna平均值进行填充Age
data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].mean())
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
data.dropna(axis=0,inplace=True)
data.info()
复制代码