【利用python进行数据分析】学习笔记-第7章 数据清洗和准备——数据转换

本文介绍了Python中的字符串操作,包括split、strip、find、count、replace等方法,以及如何使用这些方法进行字符串的拆分、查找、替换等。同时,讲解了Pandas中对字符串进行矢量化操作的函数,如contains、findall、str.get等,展示了在数据清洗和分析中如何高效处理字符串数据。此外,还展示了如何处理缺失值(NA)并提取电子邮件地址的特定部分。
摘要由CSDN通过智能技术生成

7.3 字符串操作

7.3.1 字符串对象方法

# 以逗号分隔的字符串可以⽤split拆分成数段
In [134]: val = 'a,b, guido'
    
In [135]: val.split(',')
Out[135]: ['a', 'b', ' guido']
    
# split常常与strip⼀起使⽤,以去除空⽩符(包括换⾏符)
In [136]: pieces = [x.strip() for x in val.split(',')]
    
In [137]: pieces
Out[137]: ['a', 'b', 'guido']
    
# 利⽤加法,可以将这些⼦字符串以双冒号分隔符的形式连接起来
In [138]: first, second, third = pieces
    
In [139]: first + '::' + second + '::' + third
Out[139]: 'a::b::guido'
    
# 检测⼦串的最佳⽅式是利⽤Python的in关键字,还可以使⽤index和find
In [141]: 'guido' in val
Out[141]: True
    
In [142]: val.index(',')
Out[142]: 1
    
In [143]: val.find(':')
Out[143]: -1
    
# 注意find和index的区别:如果找不到字符串,index将会引发⼀个异常(⽽不是返回-1)
In [144]: val.index(':')
---------------------------------------------------------------------------
ValueError Traceback (most recent <ipython-input-144-280f8b2856ce> in <module>()
----> 1 val.index(':')
ValueError: substring not found
                     
# count可以返回指定⼦串的出现次数
In [145]: val.count(',')
Out[145]: 2
                      
# replace⽤于将指定模式替换为另⼀个模式
In [146]: val.replace(',', '::')
Out[146]: 'a::b:: guido'
                      
In [147]: val.replace(',', '')
Out[147]: 'ab guido'
  • python内置字符串方法

    函数说明
    count返回指定⼦串的出现次数
    endswith, startswith如果字符串以某个后缀结尾(以某个前缀开头),则返回True
    join将字符串用作连接其他字符串序列的分隔符
    index如果在字符串中找到子串,则返回子串第一个字符所在的位置。如果没有找到,则引发valueError。
    find如果在字符串中找到子串,则返回第一个发现的子串的第一个字符所在的位置。如果没有找到,则返回-1
    rfind如果在字符串中找到子串,则返回最后一个发现的子串的第一个字符所在的位置。如果没有找到,则返回-1
    replace用另一个字符串替换指定子串
    strip, rstrip, lstrip去除空白符(包括换行符)。相当于对各个元素执行x.strip()(以及rstrip. lstrip)
    split通过指定的分隔符将字符串拆分为一组子串
    lower, upper分别将字母字符转换为小写或大写
    ljust, rjust用空格(或其他字符)填充字符串的空白侧以返回符合最低宽度的字符串

7.3.2 pandas的矢量化字符串函数

# 清理待分析的散乱数据时,常常需要做⼀些字符串规整化⼯作
In [167]: data = {'Dave': 'dave@google.com', 'Steve': 'steve@gmail.com',
  ......:         'Rob': 'rob@gmail.com', 'Wes': np.nan}
    
In [168]: data = pd.Series(data)
    
In [169]: data
Out[169]:
Dave   dave@google.com
Rob      rob@gmail.com
Steve  steve@gmail.com
Wes                NaN
dtype: object
    
In [170]: data.isnull()
Out[170]:
Dave   False
Rob    False
Steve  False
Wes     True
dtype: bool
    
# 通过data.map,所有字符串和正则表达式⽅法都能被应⽤于(传⼊lambda表达式或其他函数)各个值,但是如果存在NA(null)就会报错。
# 可以通过str.contains检查各个电⼦邮件地址是否含有"gmail"
In [171]: data.str.contains('gmail')
Out[171]:
Dave   False
Rob     True
Steve   True
Wes      NaN
dtype: object
    
# 也可以使⽤正则表达式,还可以加上任意re选项
In [172]: pattern
Out[172]: '([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\\.([A-Z]{2,4})'
    
In [173]: data.str.findall(pattern, flags=re.IGNORECASE)
Out[173]:
Dave   [(dave, google, com)]
Rob      [(rob, gmail, com)]
Steve  [(steve, gmail, com)]
Wes                      NaN
dtype: object
    
# 有两个办法可以实现⽮量化的元素获取操作:要么使⽤str.get,要么在str属性上使⽤索引
In [174]: matches = data.str.match(pattern, flags=re.IGNORECASE)
    
In [175]: matches
Out[175]:
Dave   True
Rob    True
Steve  True
Wes     NaN
dtype: object
    
# 要访问嵌⼊列表中的元素,我们可以传递索引到这两个函数中
In [176]: matches.str.get(1)
Out[176]:
Dave   NaN
Rob    NaN
Steve  NaN
Wes    NaN
dtype: float64
    
In [177]: matches.str[0]
Out[177]:
Dave   NaN
Rob    NaN
Steve  NaN
Wes    NaN
dtype: float64
    
# 可以利⽤这种⽅法对字符串进⾏截取
In [178]: data.str[:5]
Out[178]:
Dave   dave@
Rob    rob@g
Steve  steve
Wes      NaN
dtype: object
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

From Star.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值