动手学数据挖掘笔记(数据清理&特征处理)

数据挖掘笔记:

(一)动手学数据挖掘笔记(数据加载及探索性数据分析)

(二)动手学数据挖掘笔记(数据清理&特征处理)

(三)动手学数据挖掘笔记(数据重构)

(四)动手学数据挖掘笔记(数据可视化)

(五)动手学数据挖掘笔记(建模与评估)

数据清理&特征处理

缺失值观察与处理

1.显示缺失值数量:

df.info()
df.isnull().sum()

2.对缺失值进行处理

(1)处理缺失值一般有几种思路

(2) 请尝试对Age列的数据的缺失值进行处理

(3) 请尝试使用不同的方法直接对整张表的缺失值进行处理

df[df['Age']==None] = 0
df[df['Age'].isnull()] = 0
df[df['Age'] == np.nan] = 0

【思考】检索空缺值用np.nan要比用None好,这是为什么?

【回答】数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan

df['Age'].fillna(0, inplace=True)
df.dropna(inplace=True)
df.drop(drop_index)

一般可以通过fillna、dropna,或者通过确定了要丢弃的index之后用drop之间丢弃。

3.np.nan和Nan代表的缺失值有区别。⭐

重复值观察与处理

1.df.duplicated()查看重复值:

df.duplicated()

2.df.drop_duplicates()去重:

df.drop_duplicates()

特征观察与处理

1.pd.cut()这个函数对于从连续变量转换为分类变量也很有用。例如,cut可以将年龄转换为年龄组。

df['AgeBand'] = pd.cut(df['Age'], 5, labels=['1', '2', '3', '4', '5'])
df.head()
df['AgeBand'] = pd.cut(df['Age'], [0,5,15,30,50,80], labels=['1', '2', '3', '4', '5'])
df.head(3)
df['AgeBand'] = pd.qcut(df['Age'], [0, 0.1, 0.3, 0.5, 0.7, 0.9], labels=['1', '2', '3', '4', '5'])
df.head(3)

2.对文本变量进行转换
(1) 查看文本变量名及种类

df['Sex'].value_counts()

male      577
female    314
Name: Sex, dtype: int64
df['Sex'].unique()

array(['male', 'female'], dtype=object)
df['Sex'].nunique()

2
df['Cabin'].nunique()

147

(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示

#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head()
#方法二: map
df['Sex_num'] = df['Sex'].map({
    
    'male': 1, 'female': 2})
df.head()
#方法三: 使用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))

df.head()

(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示

#将类别文本转换为one-hot编码

#方法一: OneHotEncoder
for feat in ["Age", "Embarked"]:
    x = pd.get_dummies(df[feat], prefix=feat)
    df = pd.concat([df, x], axis=1)
    
df.head()

3.从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等):

df['Title'] = df['Name'].str.extract('([A-Za-z]+)\.', expand=False)
df.head()
这是对正则表达式的语法规则不了解的问题。([A-Za-z]+)\.这个正则模式可以这样来理解:

[A-Za-z]代表任一字母(大写或小写)
+ 代表+号前的字符出现1次或多次
\. 代表  .

([A-Za-z]+). 是匹配 一个或多个字母并且以.结尾的所有字符串组合
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40317204/article/details/108146741
今日推荐