目录
任务三(附加):从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
数据清洗及特征处理
缺失值观察与处理
任务一:缺失值观察
(1) 请查看每个特征缺失值个数
''' 方法一 '''
df.info()
''' 方法二 '''
df.isnull().sum()
df.isna().sum()
(2) 请查看Age, Cabin, Embarked列的数据
''' 方法一 '''
df[['Age','Cabin','Embarked']].head(3)
''' 方法二 '''
df.loc[:2,['Age','Cabin','Embarked']]
''' 方法三 '''
pd.DataFrame(df,columns=['Age','Cabin','Embarked']).head(3)
查询某一列缺失值:
df = pd.read_csv('train.csv')
df[np.isnan(df['Age'])]
'''易错点
np.nan != np.nan(实际np.nan不等于任何值)
故不能用df[df['Age'] == np.nan] 做判断来判断某列是否有空值!'''
任务二:对缺失值进行处理
dropna()函数
dropna(axis,how,thresh,subset,inplace)
axis:这个参数默认为0,当等于0时代表的是删除空值nan所在的行,当等于1时删除空值所在的列。
how:这个参数的值默认为‘any’,表示的是删除空值所在的行或者是列,这个主要看前面的axis参数你设定是0还是1;当参数等于‘all’,表示的是删除一阵行或者是一整列都为空值nan的行或者列,如果你的某一行或某一列,不全为空值的话,则不会删除,即不起作用。
thresh:这个参数是一个整数x,意思是保留空值nan的数量小于x的每一行或者是每一列。比如我设置x=2,那么我每一行或者是每一列的非空值的数量大于等于2的行或者列都会被保存,具体是行还是列,那还是看前面的axis参数的设置。
subset:这个参数的意思是指定删除特定行或列的空值所在的列或行,如果axis=0,表示如果指定行x中有空值,则删除所在的列;如果axis=1,表示如果指定列x有空值,则删除空值所在的行。
inplace:这个参数默认为False,它的意思是你在处理空值nan时,是在原数据上处理还是在先把原数据复制一份,然后在副本上处理,在副本上处理的时候,原数据不受任何影响;如果inplace设置为True,那代表你在原数据上进行处理,原数据直接受影响。
df = pd.read_csv('train.csv')
df.dropna(inplace=True)
df
fillna()函数
fillna(axis,mthod,limit,inplace)
axis:这个参数取1时,表示按照行来填充,取0时表示按照列来填充。默认为0,即按照列。和dropna函数的刚好相反。
method:这个参数的意思是填充的方式,如果为‘ffill’,则是将这个空值的前一个数据复制给这个空值;如果为‘bfill’,则是将这个空值的后一个数据复制给这个空值。如果不用这个参数,不声明即可。
limit:这个参数时限制填充的空值的个数,比如某一列有两个空值,我这里指定只填充一个空值,另一个空值不管它。
df = pd.read_csv('train.csv')
df.fillna(0,inplace=True)
df
Python处理数据中的空值(缺失值)时用到的dropna()函数和fillna()函数总结,通过示例弄懂这两个函数的用法。_AI学习的我的博客-优快云博客_python数据空值处理
重复值观察与处理
任务一:请查看数据中的重复值
df.duplicated
DataFrame.duplicated(subset=None, keep='first')
功能:返回一个布尔类型的Series来标注重复的行。
参数一:列名或列名的list,来标记特定考虑的列。
参数二:有{‘first’, ‘last’, False}选项,first:把重复项的第一个数据标记为False,其余为True;last,把重复项中最后一个数据标记为False,其余为True;False:把全部数据都标记为True。
'''清除重复值并保存'''
df = df.drop_duplicates()
df.head()
df.to_csv('test_clear.csv')
特征观察与处理
任务一:对年龄进行分箱(离散化)处理
#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df = pd.read_csv('train.csv')
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df.head()
#将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
df.head(3)
#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
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()
任务二:对文本变量进行转换
1.
#查看类别文本变量名及种类
#方法一: value_counts
df['Sex'].value_counts()
-------------------------------------------------------------------------------------------
male 453
female 261
0 1
Name: Sex, dtype: int64
#方法二: unique
df['Sex'].unique()
-------------------------------------------------------------------------------------------array(['male', 'female', 0], dtype=object)
df['Sex'].nunique()#输出种类数
-------------------------------------------------------------------------------------------
2
2.
#将类别文本转换为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()
print(f"feat is {feat}")
print("end")
#下回不懂的地方以这种输出进行观察
label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
#给Cabin和Ticket以range打标签,有几种打几种
print(f"label_dict is {label_dict}")
print("end label_dict")
df[feat + "_labelEncode"] = df[feat].map(label_dict)
#打好的标签以_+labelEncode方式命名存储。
df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
df.head()
little tip:zip是森莫?
a = [1,2,3] b = [4,5,6] for i in zip(a,b): print(i) ------------------------------------------------------------------------------------------- (1, 4) (2, 5) (3, 6)
3.
#将类别文本转换为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)
df.head()
little tip:onehot编码
类似于:0000 0010 0100
任务三(附加):从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
#([A-Za-z]+)\.为正则表达式,以 “.” 为终结,正好定位到 “Mr.” 或 “Miss.”
df.head()