“动手学数据分析”小组学习的Task02-学习日志


前言

本文章为天池“动手学数据分析”小组学习的Task01-学习日志,旨在了解数据清理和特征处理基本步骤及相关python处理。
学习网址添加链接描述:https://gitee.com/datawhalechina/hands-on-data-analysis


一、缺失值处理?

初步得到的未清洗数据中会有大量的缺失值,一般体现为null,对于这些数据需要识别和处理以便于后期模型拟合。

1.查看缺失值

需要实现任务:
1.处理缺失值一般有几种思路
2.请尝试对Age列的数据的缺失值进行处理
3.不同方法对整张表缺失值处理

1.1.通过info()函数查看缺失情况

代码如下:

TRAIN002.info()

结果如下:

Data columns (total 12 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   乘客ID    891 non-null    int64  
 1   是否幸存    891 non-null    int64  
 2   仓位等级    891 non-null    int64  
 3   姓名      891 non-null    object 
 4   性别      891 non-null    object 
 5   年龄      714 non-null    float64
 6   兄弟姐妹个数  891 non-null    int64  
 7   父母子女个数  891 non-null    int64  
 8   船票信息    891 non-null    object 
 9   票价      891 non-null    float64
 10  客舱      204 non-null    object 
 11  登船港口    889 non-null    object 
dtypes: float64(2), int64(5), object(5)

注:结果显示数据类型和非空,对于后期对不同数据类型的null处理更方便

1.2.通过isnull().sum()函数查看缺失情况

代码如下:

print(TRAIN002.isnull().sum())

结果如下:

乘客ID        0
是否幸存        0
仓位等级        0
姓名          0
性别          0
年龄        177
兄弟姐妹个数      0
父母子女个数      0
船票信息        0
票价          0
客舱        687
登船港口        2

注:结果查看方便,但是无法查看数据类型

2.缺失值处理

通常可以填充0,数据较少可以删除(一般不建议),还可以格局初步拟合函数预测或根据往期数据或平均数据填充,本次数据较少且无往期数据参考,考虑填充零(以Age列为例)。

2.1.缺失值填充的四种方法

方法一代码如下:

TRAIN002[TRAIN002['年龄']==None]=0 
print(TRAIN002.head(3))

方法二代码如下:

TRAIN002[TRAIN002['年龄'].isnull()] = 0 
TRAIN002.head(3)

方法三代码如下:

TRAIN002[TRAIN002['年龄'] is np.nan] = 0
print(TRAIN002.head())

方法四代码如下:

TRAIN002.fillna(0).head(5)

fila函数知识补充:
^作用:补充缺失值
^参数:fillna(inplace,method,limit,axis)
^参数详解:
^inplace参数的取值:True、False,True:直接修改原对象,False:创建一个副本,修改副本,原对象不变(缺省默认)
^method参数的取值 : {‘pad’, ‘ffill’,‘backfill’, ‘bfill’, None}, default None
pad/ffill:用前一个非缺失值去填充该缺失值
backfill/bfill:用下一个非缺失值填充该缺失值
None:指定一个值去替换缺失值(缺省默认这种方式)
^limit参数:限制填充个数
^axis参数:修改填充方向

1.2.各种方法比较

数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan常规的判断,=和is, 这对None是有效的,而对,np.nan,只能用is,np.nan与None等式不成立,,通常==判断两个变量是否相等,is 判断是否为同一个对象。

1.3.对空值删除处理

代码如下

TRAIN002.dropna().head()

dropna函数知识补充:
函数形式:dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)

参数:
^axis:轴。0或’index’,表示按行删除;1或’columns’,表示按列删除。
^how:筛选方式。‘any’,表示该行/列只要有一个以上的空值,就删除该行/列;‘all’,表示该行/列全部都为空值,就删除该行/列。
^thresh:非空元素最低数量。int型,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/列。
^subset:子集。列表,元素为行或者列的索引。如果axis=0或者‘index’,subset中元素为列的索引;如果axis=1或者‘column’,subset中元素为行的索引。由subset限制的子区域,是判断是否删除该行/列的条件判断区域。
^inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。

3.重复值处理

重复值通过删除法来处理;
有的重复值不可以删除:如交易明细和订单明细等。

删除代码如下

TRAIN002=TRAIN002.drop_duplicates()
TRAIN002.head()
TRAIN002.to_csv("D:/python/ITEM/Titanic_Machine Learning from Disaster/DATA/test_clear.csv")

二、特征观察与处理

通过观察,泰坦尼克相关数据分为两大类:
^数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征.
^文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征。
数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

1.数值型变量——分箱

1.1.平均分箱成n个年龄段

以年龄为例,分为5个段,代码如下(示例):

TRAIN002['AgeBand'] =pd.cut(TRAIN002['年龄'], 5,labels = [1,2,3,4,5])
print(TRAIN002.head(6))
TRAIN002.to_csv("D:/python/ITEM/Titanic_Machine Learning from Disaster/DATA/test_1.csv")

1.2.按一定组距分段

将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,代码如下(示例):

TRAIN002['AgeBand'] =pd.cut(TRAIN002['年龄'], [0,5,15,30,50,80],labels = [1,2,3,4,5])
print(TRAIN002.head(7))
TRAIN002.to_csv("D:/python/ITEM/Titanic_Machine Learning from Disaster/DATA/test_2.csv")

1.3.按分位数分段

将连续变量Age按10% 30% 50 70% 90%五个年龄段,代码如下(示例):

TRAIN002['AgeBand'] =pd.qcut(TRAIN002['年龄'], [0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
print(TRAIN002.head(8))


TRAIN002.to_csv("D:/python/ITEM/Titanic_Machine Learning from Disaster/DATA/test_3.csv")

2.文本变量——转换

1.1.查看变量名种类

1.1.1value_counts

代码如下:

A1=TRAIN002['客舱'].value_counts()
A2=TRAIN002['性别'].value_counts()
A3=TRAIN002['登船港口'].value_counts()
print(A1)
print(A2)
print(A3)

结果如下:

[8 rows x 14 columns]
C23 C25 C27    4
G6             4
B96 B98        4
C22 C26        3
D              3
              ..
B80            1
C52            1
A7             1
B73            1
0              1
Name: 客舱, Length: 135, dtype: int64
male      453
female    261
0           1
Name: 性别, dtype: int64
S    554
C    130
Q     28
0      1
Name: 登船港口, dtype: int64

1.1.2 unique

代码如下:

B1=TRAIN002['客舱'].unique()
B2=TRAIN002['性别'].unique()
B3=TRAIN002['登船港口'].unique()
print(B1)
print(B2)
print(B3)

结果如下:

[nan 'C85' 'C123' 0 'E46' 'G6' 'C103' 'D56' 'A6' 'C23 C25 C27' 'D33' 'B30'
 'B28' 'C83' 'F33' 'F G73' 'E31' 'A5' 'D10 D12' 'D26' 'C110' 'B58 B60'
 'E101' 'D47' 'B86' 'F2' 'C2' 'B19' 'A7' 'C49' 'F4' 'B4' 'B80' 'A31' 'D36'
 'D15' 'C93' 'C78' 'D35' 'C87' 'B77' 'E67' 'B94' 'C125' 'C99' 'C118' 'D7'
 'B49' 'D' 'C22 C26' 'C65' 'E36' 'C54' 'B57 B59 B63 B66' 'C7' 'E34' 'C32'
 'B18' 'C124' 'C91' 'E40' 'T' 'E33' 'D37' 'B35' 'E50' 'C82' 'B96 B98'
 'E10' 'C52' 'E44' 'A34' 'C104' 'C111' 'C92' 'E38' 'E12' 'E63' 'B37' 'C30'
 'D20' 'B79' 'E25' 'D46' 'B73' 'B38' 'B39' 'B22' 'C86' 'C70' 'A16' 'C101'
 'C68' 'A10' 'E68' 'B41' 'A20' 'D19' 'D50' 'D9' 'A23' 'B50' 'A26' 'D48'
 'E58' 'B71' 'B51 B53 B55' 'D49' 'B5' 'B20' 'F G63' 'C62 C64' 'E24' 'C90'
 'C126' 'C45' 'E8' 'B101' 'C46' 'D30' 'E121' 'D11' 'E77' 'B3' 'D6'
 'B82 B84' 'D17' 'A36' 'B69' 'E49' 'D28' 'E17' 'A24' 'C50' 'B42' 'C148']
['male' 'female' 0]
['S' 'C' 0 'Q' nan]

Process finished with exit code 0


1.2.将类别文本转换为数字型

1.1.1 replace

代码如下:

TRAIN002['性别1'] = TRAIN002['性别'].replace(['male','female'],[1,2])
print(TRAIN002.head())

1.1.2 map

代码如下:

TRAIN002['性别1'] = TRAIN002['性别'].map({'male': 1, 'female': 2})
print(TRAIN002.head())


1.1.3 LabelEncoder

代码如下:

from sklearn.preprocessing import LabelEncoder
for feat in ['客舱', '船票信息']:
    lbl = LabelEncoder()
    label_dict = dict(zip(TRAIN002[feat].unique(), range(TRAIN002[feat].nunique())))
    TRAIN002[feat + "_labelEncode"] = TRAIN002[feat].map(label_dict)
    TRAIN002[feat + "_labelEncode"] = lbl.fit_transform(TRAIN002[feat].astype(str))

print(TRAIN002.head(6))

结果如下:

[5 rows x 15 columns]
   乘客ID  是否幸存  仓位等级  ... 性别1 客舱_labelEncode  船票信息_labelEncode
0     1     0     3  ... NaN            135               409
1     2     1     1  ... NaN             74               472
2     3     1     3  ... NaN            135               533
3     4     1     1  ... NaN             50                41
4     5     0     3  ... NaN            135               374
5     0     0     0  ... NaN              0                 0

[6 rows x 17 columns]

Process finished with exit code 0

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

代码如下:

for feat in ["年龄", "登船港口"]:
    x = pd.get_dummies(TRAIN002[feat], prefix=feat)
    df = pd.concat([TRAIN002, x], axis=1)

print(df.head(3))

结果如下:

[6 rows x 17 columns]
   乘客ID  是否幸存  仓位等级  ... 登船港口_C 登船港口_Q  登船港口_S
0     1     0     3  ...      0      0       1
1     2     1     1  ...      1      0       0
2     3     1     3  ...      0      0       1

[3 rows x 21 columns]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值