缺失值
缺失值的检测
数值类缺失值在pandas中被显示为NaN(Not A Number);
df.info()
返回的结果中,我们只需观察每一列对应的Non-Count的数量是否等于RangeIndex即可;
df.isnull().sum()
该方法能够直观观察出每一列的缺失值数量
df.describe()
返回值中第一行count,这一行的每一个数据与其本列的总个数相减即为每一列的缺失值数量
df[['A','C','每一列的主标题']].head(3)
head()默认前五行;该方法用来查看这几列的前几行的数据
缺失值的处理
缺失值进行赋值处理:
原数据如下:
(1) df[df['某一列的表头']==None]=0
(2) df[df['Age'].isnull()]=0
处理后整行都变为0
(3) df[df['Age']==np.nan]=0
处理后整行都变为0
数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan
(4) df.fillna(0)
空缺值被填充为0
(5) df.dropna() 默认为axis=0
删除至少缺少一个元素的行
dropna函数
DataFrame.dropna(axis=0,how='any',thresh=None, subset=None, inplace=False)
axis参数确定是否删除包含缺失值的行或列:
axis=0或axis='index'删除含有缺失值的行;
axis=1或axis='columns'删除含有缺失值的列;
how参数当我们至少含有一个NA时,确定是否从DataFrame中删除行或列
how='all'时表示删除全是缺失值的行(列);
how='any'时表示删除只要含有缺失值的行(列);
thresh=n表示保留至少含有n个非NA数值的行;
subset定义要在哪些列中查找缺失值;
inplace表示直接在原DataFrame修改;
重复值
查看重复值
df.duplicated()
处理重复值
用来检测重复的行
duplicated(subset=None,keep='first')
参数:
subset:对应值列名,将列对应值相同的行进行去重,默认值None,即考虑所有列;
Keep='first/last/False';first默认值表示除第一次出现外其余相同的被标记为重复;last:除最后一次出现外,其余相同的被标记为重复;False:即所有相同的都被标记为重复;
删除重复值
df.drop_duplicates(subset=None,keep='first',inplace=False)
subset : 用来指定特定的列,默认所有列;
keep : 有三个值,{‘first’, ‘last’, False}, 默认first,删除重复项并保留第一次出现的项;
inplace:是直接在原来数据上修改还是保留一个副本;
特征值
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征;文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征;
数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
数据分箱(离散化)处理
分箱实际上是按属性值划分的子区间
pandas.cut(x, bins, right = True, labels = None, retbins = False, precision = 3, include_lowest = False, duplicates = ‘raise’, ordered = True)
x: 被切分的类数组数据,必须是1维的(不能用DataFrame)
bins: 合并的标准 int: 将 x 平分成bins份。x 的范围在每侧扩展0.1%,以包括 x 的最大值和最小值sequence of scalars: 允许不均匀宽度的bin边缘,没有扩展x的范围
interval Index: 定义要使用的精确区间 right: 表示是否包含区间最右部分,默认为right = True
labels: 指定返回的bin标签,若label = False, 仅返回bin的整数指示符
retbin: 表示是否返回bin,当bins为一个Int类型的标量时比较有用,默认rebin = False
precesion: 保留区间的小数点的位数,默认为3 include_lowest: 表示区间的左边是开的还是闭的,默认为 False
duplicates: 是否允许重复区间。raise: 不允许,drop:允许
ordered:表示标签是否有序。适用于返回类型为Categorical and Series (with Categorical dtype)。默认为True, 对生成的类型进行分类
pandas.qcut(x, q, labels = None, retbins = False, precision = 3, duplicates = 'raise')
将变量离散化为大小相等的桶
x: 被切分的类数组数据,必须是1维的
q: 分位数。10表示十分位,4表示四分位
labels: 指定返回的bin标签,若label = False, 仅返回bin的整数指示符
retbin: 表示是否返回bin,当bins为一个Int类型的标量时比较有用,默认rebin = False
precesion: 保留区间的小数点的位数,默认为3
duplicates: 是否允许重复区间。raise: 不允许,drop:允许
对文本变量进行转化
查看文本变量名及种类
df.unique() 返回特征值名称
df.nunique() 返回特征值个数
df.value_counts() 返回特征值及其个数
df['Sex_num'] =df['Sex'].replace(['male','female'],[1,2])
df['Sex_num'] =df['Sex'].map({'male': 1, 'female': 2})
使用sklearn.preprocessing的LabelEncoder
fromsklearn.preprocessingimportLabelEncoder
forfeatin ['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))
将类文本转换为one-hot编码
方法一: OneHotEncoder
forfeatin ["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的特征(Mr.Miss.Mrs)
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
这里用到正则表达式
[A-Za-z]代表任一字母(大写或小写)
+ 代表+号前的字符出现1次或多次