泰坦尼克号乘客数据:https://www.kaggle.com/c/titanic/overview
Datawhale开源课程:https://github.com/datawhalechina/hands-on-data-analysis
#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
data = pd.read_csv('train.csv')
data.head()
# 查看缺失值
# 方法一
data.info()
# 方法二
data.isnull().sum()
# 查看指定列的缺失值
data[['Age','Cabin','Embarked']].isnull()
#data[['Age','Cabin','Embarked']].isnull().sum()
【思考】检索空缺值用np.nan,None以及.isnull()哪个更好
三种方式代码如下:
# np.nan
data[data['Cabin'] == np.nan] = 0
# data.head(10)
# Nonw
data[data['Cabin']==None]=0
# data.head(10)
# isnull
data[dtat['Cabin'].isnull()]
# data.head(10)
- np.isnan()多用于单个值的检验,pd.isnull()用于对一个DataFrame或Series(整体)的检验。
- numpy和pandas的很多函数能处理NaN,但是如果遇到None就会报错
【思路】 一般可以采用以下几种:
- 直接删除缺失值项:直接删除缺失值过多的列
- 特殊值填补法:如0值、平均值、中位数等,可以减少数值上来带的误差
- .随机森林填补法:主要是基于完整的数据集,建立回归方程。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。
# 直接删除:
data0 = data.dropna()
#data0.head()
# 特殊值填补:
# 平均值
data = data.fillna(data.mean()['Age'])
# 中位数 一般很少用
data = data.fillna(data.median()['Age'])
# 0值
data = data.fillna(0)
思路:使用的是duplicated()函数
subset: 同duplicated(),设置去重的字段
keep: 这里稍有不同,duplicated()中是将除设置值以外重复值都返回True,而这里是保留的意思。同样可以设置first、last、False
- first:保留第一次出现的重复行,删除其他重复行
- last:保留最后一次出现的重复行,删除其他重复行
- False:删除所有重复行
# duplicated的返回值是布尔值,返回True和False
data[data.duplicated()]
# 指定'Cabin','Embarked'
data2[data2.duplicated(subset=['Cabin','Embarked'], keep = False)]
处理重复值
# 直接删除
data = data.drop_duplicates()
# 删除指定的列
data2.drop_duplicates(subset=['Age'],inplace=True) #inplace:布尔值,默认为False,是否直接在原数据上删除重复项或删除重复项后返回副本。
data2.reset_index(drop=True) # reset_index 可以修改删除后的索引,避免出现索引混乱
分箱操作:将数据进行等距或者等频分组,一般为数值型特征,也可以是文本型特征,但一般要把文本型转换成数值型
# 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
data['AgeBand'] = pd.cut(data['Age'], 5,labels = list('12345'))
#data.head()
# 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
data['AgeBand'] = pd.cut(data['Age'], [0,5,15,30,50,80],right = False)
#data.head()
# 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
data['AgeBand'] = pd.cut(data['Age'], [0,0.1,0.3,0.5,0.7,0.9],labels = list('1234'))
#data.head()
1. 查看文本变量名以及种类
# 查看文本变量名及种类
#方法一: value_counts
data['Sex'].value_counts()
# data['Cabin'].value_counts()
# data['Embarked'].value_counts()
# 方法二:unique
data['Sex'].unique()
# data['Cabin'].unique()
# data['Embarked'].unique()
2. 文本转换表达
# 将类别文本转换为数字表达
# 方法一: replace
data['Sex_num'] = data['Sex'].replace(['male','female'],[0,1])
data.head()
# 方法二: map
data['Sex_num'] = data['Sex'].map({'male': 0, 'female': 1})
data.head()
# 方法三:使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder # 加载
data['Cabin'] = LabelEncoder().fit_transform(data['Cabin']) # 参数只能是字符串或者数字(argument must be a string or number)
# Datawhale参考写法
for feat in ['Cabin', 'Ticket']:
lbl = LabelEncoder()
label_dict = dict(zip(data0[feat].unique(), range(data0[feat].nunique())))
data0[feat + "_labelEncode"] = data0[feat].map(label_dict)
data0[feat + "_labelEncode"] = lbl.fit_transform(data0[feat].astype(str))
- onehot编码又叫独热编码,其为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
- Onehot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。
参考链接:https://www.jianshu.com/p/38f9f426e246
# 将文本变量Sex, Cabin, Embarked用one-hot编码表示
for col in ['Sex','Cabin','Embarked']:
x = pd.get_dummies(data[col], prefix = col)
data = pd.concat([data,x],axis = 1) # 将转换好的x按列拼接到原数据data中
data.head()
(从Name中提取Titles,即Mr,Miss,Mrs等)
Series.str可用于以字符串形式访问系列的值并对其应用几种方法。 Pandas Series.str.extract()函数用于提取正则表达式中的捕获组作为DataFrame中的列。对于系列中的每个主题字符串,从正则表达式pat的第一个匹配项中提取组。
Series.str.extract(pat, flags=0, expand=True)
【参数】:
- pat: 具有捕获组的正则表达式模式。
- flags: int,默认值为0
- expand:如果为True,则返回每个捕获组只有一列的DataFrame。
data['Title'] = data.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()