微信号:shushuojun

介绍:数据分析师之家.旨在为数据人提供一个学习、分享、互帮互助的家园.

统计师的Python日记【第八天:数据清洗(2)文本处理】

2016-06-02 19:31 数说君

本文是【统计师的Python日记】第8天的日记


回顾一下:


  • 第1天学习了Python的基本页面、操作,以及几种主要的容器类型。

  • 第2天学习了python的函数、循环和条件、类。

  • 第3天了解了Numpy这个工具库。

  • 第4、5两天掌握了Pandas这个库的基本用法。

  • 第6天学习了数据的合并堆叠。

  • 第7天开始学习数据清洗,着手学会了重复值删除、异常值处理、替换、创建哑变量等技能。


原文复习(点击查看):


【第1天:谁来给我讲讲Python?】


【第2天:再接着介绍一下Python呗】


【第3天:Numpy你好】


【第4天:欢迎光临Pandas】


【第四天的补充


【第5天:Pandas,露两手】


【第6天:数据合并】


【第七天:数据清洗(1)】


今天将带来第8天的学习日记。


目录如下:


前言

1. 去除空白

2. 分列

3. 把多选题的文本处理成哑变量

4. 下集预告




统计师的Python日记【第8天:数据清洗(2)文本处理】


前言


根据我的Python学习计划:


Numpy → Pandas 掌握一些数据清洗、规整、合并等功能 → 掌握类似与SQL的聚合等数据管理功能 → 能够用Python进行统计建模、假设检验等分析技能 → 能用Python打印出100元钱 → 能用Python帮我洗衣服、做饭 → 能用Python给我生小猴子......


从第6天开始入手学习了一些非常实用的Python数据处理技能,昨天(第7天)学习了数据的清洗,用的例子是一份心脏病病人的问卷数据:




为了方便,假设只有这些变量:


  • Age:年龄

  • Areas:来自哪里,有A/B/C/D四个地区

  • ID:患者的唯一识别编号

  • Package:每天抽几包烟,缺失的为-9,代表不抽烟

  • SHabit:睡眠习惯,1-早睡早起;2-晚睡早起;3-早睡晚起;4-晚睡晚起


我把这份数据中存在的问题一一处理了,包括:


  • 重复值删除

ID为1的出现了三次、ID为5的出现了两次、ID为9和10的都分别出现了两次。


  • 异常值检测

年龄还有158岁的、还有6岁的并且已经开始吸烟。


  • 替换

将年龄异常的替换成缺失,将抽烟为-9的替换成0(不抽烟就是抽烟数量为0,替换之后既合理又可以减少缺失值)


  • 数据映射

将Areas四个地区分别映射成农村(R)和城市(U)。


  • 数值变量类型化

将年龄再进行一个分组,从连续变量变成类型变量。


  • 创建哑变量

SHabit睡眠习惯的4个取值是无序并列的,这种情况在分析的时候要变成哑变量


也留了一个问题:如果SHabit是多选呢?像这样:




这个就更要创建哑变量了,就是把一个问题分成四个。但是用第7天的函数get_dummies()是搞不定的,这属于文本格式。


好吧,那么今天就专门学习一下如何清洗乱七八糟的文本数据吧!



1. 去除空白


先等一会解决那个多选问题,从最基本的开始,如果我们的文本数据中,混入了很多空格该怎么办?比如Areas这个变量:



这个问题不是钻牛角尖,因为之前经常遇到这样的情况,它会带来很多麻烦,比如,我想筛选出Areas为A的数据,用 if Areas == ’A‘,那些带空白的你就找不出来了。


之前知道strip()这个函数可以解决单个字符串的问题:



那么在Pandas中,是否可以直接用strip()?




Series是不可以直接用strip()的,.map(str.strip) 可以帮我解决:

data_noDup_rep_dum ['Areas'].map(str.strip)





2. 分列


很久之前,使用excel的岁月里,分列功能没少用过,有的数据是通过A:B的形式储存在一列中,分析的时候要把两列劈开。这里假设数据的ID与性别“粘”在一起了,格式为 ID:Gender



分号前面的是ID,分号后面的代表性别,0为男性,1为女性。split() 可以帮我把它们劈开,如果是单个字符串,直接使用即可:



但对于Pandas的数据结构,则要写循环:

IDGender = pd.DataFrame((x.split(':') for x in data_noDup_rep_dum.ID))


此句的意思就是将data_noDup_rep_dum中的ID列,逐行给劈开,结果为:




注意看变量的列名为0、1,非常的丑,所以我决定再加上columns=指定一下列名


IDGender = pd.DataFrame((x.split(':') for x in data_noDup_rep_dum.ID), columns=['ID_new','Gender'])



然后再将这两列粘贴到原数据中去:


pd.merge(IDGender, data_noDup_rep_dum, right_index=True,left_index=True)


错了!!


为什么?注意看劈开之后的IDGender数据,索引是0、1、2、3...9,从0到9,而原数据data_noDup_rep_dum的索引则是0、3、4、5......是因为前期我在做清洗的时候很多数据被砍掉了,所以没有1、2等。想索引一致,只需要在spilt(':')这个语句中加上index=data_noDup_rep_dum.index,换成原数据的索引即可。

IDGender = pd.DataFrame((x.split(':') for xin data_noDup_rep_dum.ID) , index=data_noDup_rep_dum.index, columns=['ID_new','Gender'] )




那么现在与原数据合并起来就行了:


print pd.merge(IDGender, data_noDup_rep_dum, right_index=True, left_index=True)





3. 把多选题的文本创建成哑变量


正如开头所说的,如果SHabit是多选:




这种变量在分析的时候完全没有用,必须要处理成哑变量,那么第7天中学的

get_dummies是否可以呢?试一下吧:




哑变量是生成了,但不是我想要的,我想要的就是四个选项变成的四个问题:1 2 3 4,当一个人多选了1和2,那么就在问题1下面和问题2下面赋值为1,其他赋值为0。


str.contains() 可以帮我解决,它的作用是,在SHabit列中查找某个元素,当含有这个元素时,赋值为True,否则为False:


data_noDup_rep_mul['SHabit_1'] = data_noDup_rep_mul['SHabit'].str.contains('1') 


这个语句会生成一个新变量,SHabit_1,当原变量SHabit中包含1时,它为True,否则为False。




用同样的方法生成SHabit_2、SHabit_3、SHabit_4:




后期再处理成0/1就可以了。

 

关于文本数据的处理,还有很多很多其他情况,比如下面这份文本数据:


(01)1872-8756

Body shop P1

Book B13

(05)9212-0098

PD(05)9206-4571

Shushuophone

(12) 6753-5513

None here

PD(12)6434-4532

P&DWashing

......(未显示完)


假设这是一份产品名单,我现在只想把数字编码的数据,也即红色部分筛选出来,应该如何做?


(看过数说工作室的【SAS 正则表达式】系列的朋友一定不会陌生,这是那上面的例子)



4. 下集预告


下一集我将继续学习Python的正则表达式处理文本,想跟数说君的日记一起学习的朋友,强烈建议先阅读一下【SAS 正则表达】这个系列。专门为数据分析师打造!(在数说工作室微信后台回复【sasre】查看)




做个小游戏,您觉得本【统计师的Python日记】系列如何?


1、不好——跳转至A


2、好——跳转至2.1


2.1 打赏吗?

打赏——跳转至B

不打赏——跳转至2.2


2.2 点击文末广告?

点击——跳转至C

不点击——跳转至A


A 有什么建议意见呢?您可以在文末评论区留言,帮我做的越来越好!

B 谢谢爷~!劳驾您在文末打赏,我会再接再厉哒!

C 谢谢小哥,谢谢美女~!广告商会给我打赏哒!



1. 稿件转载请在开头注明数说工作室:shushuojun,文末附上二维码


2. 关于数据分析的提问求助,可以在分答中搜索“数说君”找我


3. 投稿、免费发布招聘、合作,请加数说君个人微信AnselT,或Email:jiayounet@163.com。


4. 查看所有文章请在后台回复【M】

数说工作室

数据分析师之家 | 算法、技术、人才、资本

微信ID:shushuojun


长按二维码关注数说工作室

 
数说工作室 更多文章 余额宝为什么不该被取缔? 盈余管理的测量 量化投资之多因子选股模型 金融数据挖掘之决策树(ID3) 量化投资之动量反转
猜您喜欢 如何为ipa文件重新签名 Vertica出马,资源管理如鱼得水 Web服务器Nginx多方位优化策略 17岁破解iPhone的熊孩子, 用6000元改造出了自动驾驶汽车 App孤岛战争