Python数据挖掘与机器学习_通信信用风险评估实战(2)——数据预处理
来源:互联网 发布:cf积分刷枪软件 编辑:程序博客网 时间:2024/06/06 04:12
系列目录:
Python数据挖掘与机器学习_通信信用风险评估实战(1)——读数据
数据说明
通过对读取数据的实践,下面是数据集文件对应读取后的DataFrame说明。
DataTech_Credit_Train_Communication1.txt
train_comm
DataTech_Credit_Train_User1
train_user
DataTech_公共数据_基础信息1
train_basic
DataTech_公共数据_通话1
train_call
重塑(reshape)和轴向旋转(pivot)
其中train_comm
有201703-201706共4个月的用户通话数据,以”长格式(long)”或”堆叠格式(stacked)”存储,UserI_Id
直接关联其他DataFrame会出现一对多的情况,故需要对它进行重塑(reshape)和旋转(pivot)运算。train_comm
有4列数据:'UserI_Id'
, 'R3A_Stop_Days'
, 'R3A_Stop_Cnt'
, 'date'
,假设只有一个需要参与重塑的数据列,可利用DataFrame的pivot方法实现转换,train_comm_pivoted = train_comm.pivot('UserI_Id', 'date', 'R3A_Stop_Days')
,前两个参数值分别用作行和列索引的列名,最后一个参数值是用于填充DataFrame的数据列的列名,假设有两个需要参与重塑的数据列,那么忽略最后一个参数,得到的DataFrame就会带有层次化的列。其实,pivot只是一个快捷方式而已,用set_index创建层次化索引,再用unstack重塑可以达到同样效果。
train_comm_pivoted = train_comm.pivot('UserI_Id', 'date')# train_comm_pivoted = train_comm.set_index(['UserI_Id', 'date']).unstack('date') R3A_Stop_Days R3A_Stop_Cntdate 201703 201704 201705 201706 201703 201704 201705 201706UserI_Id 10032318 1 1 1 1 1 1 1 110041348 1 1 1 1 1 1 1 110076180 1 1 1 1 1 1 1 110099716 4 4 4 4 2 2 2 110101115 1 1 1 1 1 1 1 1
层次化索引
但是,这样生成的DataFrame有multiindex columns
,而我们其他的DataFrame没有,那么怎样合并具有不同列索引层次的DataFrame呢。假设合并的两个DataFrame为train_user
和train_comm_pivoted
,这里提供两种解决的方案。
一是Index to MultiIndex,add a level to the columns of train_user,
train_user.columns = pd.MultiIndex.from_product([train_user.columns, ['in']]) UserI_Id RISK_Flag in in0 60015357 01 60015359 12 60015362 13 60015365 04 10032318 1
二是MultiIndex to Index,
train_comm_pivoted.columns = ['%s%s' % (a, '|%s' % b if b else '') for a, b in train_comm_pivoted.columns] R3A_Stop_Days|201703 R3A_Stop_Days|201704 R3A_Stop_Days|201705 R3A_Stop_Days|201706 R3A_Stop_Cnt|201703 R3A_Stop_Cnt|201704 R3A_Stop_Cnt|201705 R3A_Stop_Cnt|201706UserI_Id 10032318 1 1 1 1 1 1 1 110041348 1 1 1 1 1 1 1 110076180 1 1 1 1 1 1 1 110099716 4 4 4 4 2 2 2 110101115 1 1 1 1 1 1 1 1
为了方便后续与其他数据集的合并,我选择了MultiIndex to Index。
数据库风格的DataFrame合并
应用pandas的merge函数,接下来就可以合并train_user
和train_comm_pivoted
这两个DataFrame了。
train_user_comm = pd.merge(train_user, train_comm_pivoted, how='left', left_on='UserI_Id', right_index=True, suffixes=('_user', '_comm'))
pd.merge函数的参数
当然,合并数据集还可以用一些其他的方式,如pandas.concat
、DataFrame1.join(DataFrame2)
,DataFrame的join实例方法,能更为方便的实现按索引的合并,它还可用于合并多个带有相同或相似索引的DataFrame对象,而不管它们有没有重叠的列。这里就引出下一个话题,将DataFrame的一个或多个列当做行索引来用,或者可能希望将行索引变成DataFrame的列。
列和行索引的转换
DataFrame的set_index
函数会将一个或多个列转化为行索引,并创建一个新的DataFrame。
# column to indextrain_user = train_user.set_index('UserI_Id')
reset_index
的功能跟set_index
刚好相反,层次化索引的级别会被转移到列里面。
# UserI_Id reset_index() to Columntrain_comm_pivoted = train_comm_pivoted.reset_index()
移除重复数据
DataFrame中经常出现重复行,可以用DataFrame的duplicated
方法返回一个布尔型Series,表示各行是否是重复行,还有一个drop_duplicates
方法,用于返回一个移除了重复行的DataFrame。这两个方法默认会判断全部列,我们也可以指定部分列进行重复项判断。且,它们默认保留的是第一个出现的值组合,传入参数take_last=True
则保留最后一个。
train_basic = train_basic.drop_duplicates()
索引、选取
对DataFrame进行索引是获取一个或者多个列。
train_user_comm_basic[['UserI_Id', 'RISK_Flag']].head() UserI_Id RISK_Flag0 60015357 01 60015359 12 60015362 13 60015365 04 10032318 1
但是,这种索引方式有几个特殊的情况,首先通过切片或布尔型数组选取行。
train_basic_201706 = train_basic[train_basic['date'] == 201706]
为了在DataFrame行上进行标签索引,引入索引字段ix
。它可以通过NumPy式的标记法和轴标签从DataFrame选取行和列的子集。
train_user_comm_basic.ix[:3, ['UserI_Id', 'RISK_Flag']].head() UserI_Id RISK_Flag0 60015357 01 60015359 12 60015362 13 60015365 0# 切片选取,行包括末端,列不包括???train_user_comm_basic.ix[:3, :3].head() UserI_Id RISK_Flag R3A_Stop_Days|2017030 60015357 0 11 60015359 1 42 60015362 1 23 60015365 0 1
通过本篇的数据预处理,基本可以形成原始基础数据的一张宽表,因为给出的原始数据是脱敏的,已经做了离散化处理,如果认为宽表的特征还不够丰富的话,可以基于自己对业务和数据的理解衍生一些新的特征。
附1:bug参考资料
Join dataframes - one with multiindex columns and the other without
https://stackoverflow.com/questions/43223615/join-dataframes-one-with-multiindex-columns-and-the-other-without
Pandas dataframe with multiindex column - merge levels
https://stackoverflow.com/questions/24290297/pandas-dataframe-with-multiindex-column-merge-levels
微信公众号「数据分析」,分享数据科学家的自我修养,既然遇见,不如一起成长。
- Python数据挖掘与机器学习_通信信用风险评估实战(2)——数据预处理
- Python数据挖掘与机器学习_通信信用风险评估实战(1)——读数据
- Python数据挖掘与机器学习_通信信用风险评估实战(3)——特征工程
- Python数据挖掘与机器学习_通信信用风险评估实战(4)——模型训练与调优
- Python数据分析与挖掘实战(数据预处理)
- 机器学习实战--数据预处理
- Python数据分析与挖掘实战—挖掘建模
- python数据挖掘与分析实战—1、2、3
- python数据挖掘入门与实战——学习笔记(第1、2章)
- python数据分析与挖掘学习笔记(2)-淘宝商品数据清洗及预处理
- 数据科学家——数据挖掘与机器学习
- 2017新Python机器深度学习自然语言处理视频教程文本挖掘算法实战 Python机器学习算法升级版 机器学习与数据挖掘(视频+课件+源码)
- 机器学习与数据挖掘_线性模型 II
- 《Python数据分析与挖掘实战》笔记(四):数据预处理
- python数据挖掘笔记(1)—数据预处理
- 机器学习与数据挖掘
- 机器学习与数据挖掘
- 机器学习与数据挖掘
- OpenSSL中文手册之ASN1库详解(未完待续)
- composer 的安装和创建项目
- Matlab 图像处理之距离函数
- Akka简单性能分析
- effectIveC++的笔记之operator=
- Python数据挖掘与机器学习_通信信用风险评估实战(2)——数据预处理
- 美团点评:网格走法数目
- Xmind基础教程-查找和替换
- 你不知道的box-shadow
- cf840A Leha and function
- windowss下python安装pip
- 使用Akka的Actor和Future简单地实现并发处理
- cookies
- 巧用SQL的with语法生成临时结果集,进行查询与更新同步操作,解决高并发下对数据的重复访问