##查看缺失值
#方法一:isnull() ##isnull()替换成notnull()就是统计非缺失值数
rows_null=dep.isnull().sum(axis=1)#查看每行有多少缺失值
cols_null=dep.isnull().sum(axis=0)#查看每列有多少缺失值(默认axis=0,不写也可)
all_null=dep.isnull().sum().sum() #查看整表有多少缺失值
sp_null=dep[['年龄','客舱']].isnull().sum()#查看特定列的缺失值数
#方法二:count() #先查出非缺失值数
rows_not_null=dep.count(axis=1)#查看每行有非缺失值
cols_not_null=dep.count(axis=0)#查看每列有非缺失值
sp_not_null=dep[['年龄','客舱']].count() #查看特定列多少非缺失值
cols_num=dep.count().count() #查看整表有多少列,等同 dep.shape[1]
rows_num=dep.count(axis=1).count() #查看整表有多少列,等同 dep.shape[0]
#方法三:df.info()直接查看表信息,统计非缺失值
dep.info()
##查看特定列数据
dep[['年龄','客舱','票价']].head(10)
空值:在pandas中的空值是:" "
缺失值:pandas里,如果是DataFrame中,缺失值可以表示为nan或者naT(缺失时间)。如果是在Series中,则为none或者nan。
None: 是Python自带的数据类型,被看作一个object对象,不能参与到任何计算中
np.nan: float类型 能参与计算,但结果总是nan
所以,检索空缺值用np.nan要比用None好。
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
函数作用:删除含有空值的行或列
函数具体参数:
axis维度,axis=0表示index行,axis=1表示columns列,默认为0
how"all"表示这一行或列中的元素全部缺失(为nan)才删除这一行或列,"any"表示这一行或列中只要有元素缺失,就删除这一行或列
thresh axis中至少s有thresh个非缺失值,否则删除。
subset在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除(有axis决定是行还是列)
inplace刷选过缺失值得新数据是存为副本还是直接在原数据上进行修改。默认是False,即创建新的对象进行修改,原对象不变,和深复制和浅复制有些类似。
注意:drop方法中的axis值与其他方法相反,axis=0表示行,=1表示列。
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
函数作用:填充缺失值
主要参数:
value 需要用什么值去填充缺失值
axis 确定填充维度,从行开始或是从列开始
method 填充缺失值所用的方法。
limit 确定填充的个数,如果limit=2,则只填充两个缺失值。
# 方法一:dropna()函数
#删除含缺失值的列
a=dep.dropna(axis=1)
#删除任何含有缺失值的列
b=dep.dropna(axis=1,how='any')
#删除少于12个的非缺失值的行
c=dep.dropna(thresh=12)
#删除指定列中的有缺失值的行
d=dep.dropna(subset=['年龄','客舱','登船港口'])
使用:
method
(1)ffill:用缺失值前面的一个值代替缺失值,如果axis =1,那么就是横向的前面的值替换后面的缺失值,如果axis=0,那么则是上面的值替换下面的缺失值。横向用缺失值前面的值替换缺失值"/“纵向用缺失值上面的值替换缺失值”,
这一种方法,都是用缺失值前面的值对缺失值进行填充。(行/列都可以指定)
(2)backfill/bfill:缺失值后面的一个值代替前面的缺失值(具体用法与前面类似)。
注意~用这种方法时不能与value同时出现。
# 方法二:fillna()函数
#所有缺失值用0填充
e=dep.fillna(0)
#不同列用不同值填充,value为字典格式;limit=1限制只填充1个(若取消该限制,默认都填充)
values={
'年龄':0,'客舱':'a'}
f=dep.fillna(value=values,limit=1)
#默认axis=0,表示 列维度上空缺值由上一个填充;如果axis=1,则表示行维度上空缺值由前一个填充
g=dep.fillna(axis=0,method='ffill')
#使用均值mean()来填充:
##法一:指定列填充(此处只有年龄列可以有平均值)
h=dep.fillna(dep.mean()['年龄'])
##法二:列填充(默认只会填充可以有平均值的列)
i=dep.fillna(dep.mean())
h
https://zhuanlan.zhihu.com/p/109366433
https://zhuanlan.zhihu.com/p/109434512
DataFrame.duplicated(subset = None,keep =‘first' )返回boolean Series表示重复行
参数:
subset:列标签或标签序列,可选
仅考虑用于标识重复项的某些列,默认情况下使用所有列
keep:{‘first’,‘last’,False},默认’first’
first:标记重复,True除了第一次出现。
last:标记重复,True除了最后一次出现。
False:将所有重复项标记为True。
import pandas as pd
import numpy as np
dep=pd.read_csv('titanic/train_chinese.csv')
#duplicated()查看重复值
a=dep[dep.duplicated()]
DataFrame.drop_duplicates(subset = None,keep ='first',inplace = False )
参数:
subset : 指定列,默认情况下使用所有列
keep : {‘first’,‘last’,False},默认’first’
first :删除重复项保留第一次出现的。
last :删除重复项保留最后一次出现的。
false:删除所有重复项。
inplace : 布尔值,默认为False
# drop_dujplicates()去除重复值
b=dep.drop_duplicates(['登船港口'])#按指定列去重
b
我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
分箱处理:对数据进行分类
import pandas as pd
import numpy as np
dep=pd.read_csv('titanic/train_chinese.csv')
dep_new=pd.DataFrame(dep['年龄']) #定义dep_new
dep_new['年龄区间1']=pd.cut(dep['年龄'],bins=[0,30,60,80]) #分区间
dep_new['分类1']=pd.cut(dep['年龄'],bins=[0,30,60,80],labels=['青年','中年','老年']) #指定labels
dep_new['年龄区间2']=pd.cut(dep['年龄'],5) #按照年龄平均分成 5个区间
dep_new['分类2']=pd.cut(dep['年龄'],5,labels=['1','2','3','4','5']) #指定labels
# qcut()
dep_new['年龄区间3']=pd.qcut(dep['年龄'],[0,0.1,0.3,0.5,0.7,0.9,1]) #按照百分比分成 5个区间
dep_new['分类3']=pd.qcut(dep['年龄'],[0,0.1,0.3,0.5,0.7,0.9,1],labels=['1','2','3','4','5','6']) #指定labels
dep_new
查看
import pandas as pd
import numpy as np
dep=pd.read_csv('titanic/train_chinese.csv')
#方法一: value_counts() 对不同对象计数
a=dep['登船港口'].value_counts(ascending=True)
#方法二: unique() nunique()
b=dep['登船港口'].unique()
c=dep['登船港口'].nunique()
b
unique()是以 数组形式(numpy.ndarray)返回列的所有唯一值(特征的所有唯一值)
nunique() 返回的是唯一值的个数
文本转换
pandas.Series.map:
Series.map(self, arg, na_action=None)
import pandas as pd
import numpy as np
dep=pd.read_csv('titanic/train_chinese.csv')
# replace()
dep['Sex']=dep['性别'].replace({
'male':1,'female':2})
#map()
dep['Sex2']=dep['性别'].map({
'male':1,'female':2})
dep
------------------------------------我是分割线,下面还不太理解--------------------------
sklearn处理分类特征
preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值
from sklearn.preprocessing import LabelEncoder
for feat in ['客舱', '船票信息']:
lbl = LabelEncoder()
label_dict = dict(zip(dep[feat].unique(), range(dep[feat].nunique())))
dep[feat + "_labelEncode"] = dep[feat].map(label_dict)
dep[feat + "_labelEncode"] = lbl.fit_transform(dep[feat].astype(str))
dep.head()
将类别文本转换为one-hot编码
for feat in ['年龄', '登船港口']:
# x = pd.get_dummies(df["Age"] // 6)
# x = pd.get_dummies(pd.cut(df['Age'],5))
x = pd.get_dummies(dep[feat], prefix=feat)
dep = pd.concat([dep, x], axis=1)
#df[feat] = pd.get_dummies(df[feat], prefix=feat)
dep.head()```
#### 2.3.3 特征提取
```python
dep['Title'] = dep['乘客姓名'].str.extract('([A-Za-z]+)\.', expand=False)
dep.to_csv('train_clean_final.csv')
dep
1.对缺失值进行处理
用合乎逻辑的数替代缺失值(比如0或者平均数,上一位数等)
2.清除重复值
3.对年龄分箱处理(分为5段)
4.对文本变量进行转换
如将文本变量用数字变量或者one-hot编码
5.从字段中提取特征值
6.数据预处理完毕,保存数据
https://www.cnblogs.com/lavender1221/p/12724186.html#
https://zhuanlan.zhihu.com/p/59252361