Pandas数据清理及特征处理
1 缺失值观察及处理
1.1 缺失值观测
数据集下载 链接: https://www.kaggle.com/c/titanic/overview
//方法一
df.info()
上述 观察到 ‘Age’,'Cabin‘,'Embarked’列分别是 714,204,889 不是空的(not-null),但总列数为891,因此这三列是 NaN
//方法二
//使用isnull()方法,查看‘NaN’的个数
df.isnull().sum()
1.2缺失值处理
注意:以下两种使得'Age'列为Nan值的一行全为0,当进行重复值处理时会有较多的重复数据。
//方式一
df[df['Age'].isnull()] = 0
//方式二
df[np.isnan(df['Age'])] = 0
//方式三
df = df.dropna()
df.shape //结果:(183,12) 原有行列(891,12)
//直接把有空缺值的行全部删除
//方式四
//df.fillna(0).head(3)
df.shape //结果:(891,12)
//把空缺值填充为0
2 重复观察与处理
2.1 查看重复值
采用缺失值处理前两种方式,会有较多重复值
df[df.duplicated()]
2.2 重复值处理
df = df.drop_duplicates()
3特征观察与处理
3.1 对数值进行离散化处理
//方式一,'Age'列分成5个年龄段,分别用 1,2,3,4,5分类表示
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
//方式二:
//'Age'列划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,分别用 1,2,3,4,5分类表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
//方式三
//'Age'列按10% 30% 50 70% 90%五个年龄段,分别用 1,2,3,4,5分类表示
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
3.2 对文本进行查看
//查看类别文本变量名及种类
//方法一: value_counts
df['Sex'].value_counts()
//输出:类别:‘male’,‘female’
male 577
female 314
Name: Sex, dtype: int64
#方法二: unique
df['Sex'].unique() //输出:array(['male', 'female'], dtype=object)
df['Sex'].nunique()//输出:2 //表示2个类别
3.3 #将类别文本进行转换
//方法一: replace 将性别male转为1 ,female转为2
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
//方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
//方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
lbl = LabelEncoder()
label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
df[feat + "_labelEncode"] = df[feat].map(label_dict)
df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
//zip():将df[feat].unique(),range(df[feat].nunique() 对应元素转为元组列表
//dict():转为字典
//df[feat].map :按照字典类型进行文本转换
//fit(y) :fit看做一本空字典,y可看作要塞到字典中的词
//fit_transform(y):相当于先进行fit再进行transform,即把y塞到字典中去以后再进行transform得到索引值
//将类别文本转换为one-hot编码
// OneHotEncoder
for feat in ["Age", "Embarked"]:
# x = pd.get_dummies(df["Age"] // 6)
# x = pd.get_dummies(pd.cut(df['Age'],5))
x = pd.get_dummies(df[feat], prefix=feat)//进行编码
df = pd.concat([df, x], axis=1)//合并列
#df[feat] = pd.get_dummies(df[feat], prefix=feat)
//从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
//提取.之前的字母