您的位置:首页 > 编程语言

【编程实践】Joyful-Pandas(下)Task02(第七章):文本数据

2020-07-16 05:55 639 查看

【编程实践】Joyful-Pandas(下)Task02(第七章):文本数据

  • 拆分与拼接
  • str.cat方法
  • cat中的索引对齐
  • 替换
  • 子串匹配与提取
  • 常用字符串方法
  • 问题与练习
  • 缺失数据和文本数据(尤其是混杂性文本)是数据预处理中比较麻烦的类型,本章节聚焦于文本数据。

    理论部分

    • 掌握基本正则表达式的用法
    • 理解string类型的性质
    • 掌握文本类型的5类操作
    • 熟悉常见字符串方法

    练习部分

    • 两道文本数据练习题
    import pandas as pd
    import numpy as np

    string类型的性质

    string与object的区别

    string类型和object不同之处有三:

    1. 字符存取方法(string accessor methods,如str.count)会返回相应数据的Nullable类型,而object会随缺失值的存在而改变返回类型
    2. 某些Series方法不能在string上使用,例如: Series.str.decode(),因为存储的是字符串而不是字节
    3. string类型在缺失值存储或运算时,类型会广播为pd.NA,而不是浮点型np.nan
      其余全部内容在当前版本下完全一致,但迎合Pandas的发展模式,我们仍然全部用string来操作字符串

    String类型的转换

    如果将一个其他类型的容器直接转换string类型可能会出错:

    #pd.Series([1,'1.']).astype('string') #报错
    #pd.Series([1,2]).astype('string') #报错
    #pd.Series([True,False]).astype('string') #报错

    当下正确的方法是分两部转换,先转为str型object,在转为string类型:

    pd.Series([1,'1.']).astype('str').astype('string')
    pd.Series([1,2]).astype('str').astype('string')
    pd.Series([True,False]).astype('str').astype('string')

    拆分与拼接

    str.split方法

    分割符与str的位置元素选取

    s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")
    s

    根据某一个元素分割,默认为空格

    s.str.split('_')

    这里需要注意split后的类型是object,因为现在Series中的元素已经不是string,而包含了list,且string类型只能含有字符串
    对于str方法可以进行元素的选择,如果该单元格元素是列表,那么str[i]表示取出第i个元素,如果是单个元素,则先把元素转为列表在取出

    s.str.split('_').str[1]
    pd.Series(['a_b_c', ['a','b','c']], dtype="object").str[1]
    #第一个元素先转为['a','_','b','_','c']

    其他参数

    expand参数控制了是否将列拆开,n参数代表最多分割多少次

    s.str.split('_',expand=True)
    s.str.split('_',n=1)
    s.str.split('_',expand=True,n=1)

    str.cat方法

    不同对象的拼接模式

    cat方法对于不同对象的作用结果并不相同,其中的对象包括:单列、双列、多列
    ① 对于单个Series而言,就是指所有的元素进行字符合并为一个字符串

    s = pd.Series(['ab',None,'d'],dtype='string')
    s
    s.str.cat()

    其中可选sep分隔符参数,和缺失值替代字符na_rep参数

    s.str.cat(sep=',')
    s.str.cat(sep=',',na_rep='*')

    ② 对于两个Series合并而言,是对应索引的元素进行合并

    s2 = pd.Series(['24',None,None],dtype='string')
    s2
    s.str.cat(s2)

    同样也有相应参数,需要注意的是两个缺失值会被同时替换

    s.str.cat(s2,sep=',',na_rep='*')

    ③ 多列拼接可以分为表的拼接和多Series拼接
    表的拼接

    s.str.cat(pd.DataFrame({0:['1','3','5'],1:['5','b',None]},dtype='string'),na_rep='*')
    s.str.cat([s+'0',s*2])

    cat中的索引对齐

    当前版本中,如果两边合并的索引不相同且未指定join参数,默认为左连接,设置join=‘left’

    s2 = pd.Series(list('abc'),index=[1,2,3],dtype='string')
    s2
    s.str.cat(s2,na_rep='*')

    替换

    广义上的替换,就是指str.replace函数的应用,fillna是针对缺失值的替换,上一章已经提及
    提到替换,就不可避免地接触到正则表达式,这里默认读者已掌握常见正则表达式知识点,若对其还不了解的,可以通过这份资料来熟悉

    子串匹配与提取

    1. str.extract方法
    2. str.extractall方法
    3. str.contains和str.match

    常用字符串方法

    1. 过滤型方法
      (a)str.strip
      (b)str.lower和str.upper
      (c)str.swapcase和str.capitalize
    2. isnumeric方法

    问题与练习

    问题

    问题一
    str对象方法和df/Series对象方法有什么区别?

    问题二
    给出一列string类型,如何判断单元格是否是数值型数据?

    问题三
    rsplit方法的作用是什么?它在什么场合下适用?

    问题四
    在本章的第二到第四节分别介绍了字符串类型的5类操作,请思考它们各自应用于什么场景?

    练习

    练习一
    现有一份关于字符串的数据集,请解决以下问题:
    (a)现对字符串编码存储人员信息(在编号后添加ID列),使用如下格式:“×××(名字):×国人,性别×,生于×年×月×日”
    (b)将(a)中的人员生日信息部分修改为用中文表示(如一九七四年十月二十三日),其余返回格式不变。
    (c)将(b)中的ID列结果拆分为原列表相应的5列,并使用equals检验是否一致。

    pd.read_csv('data/String_data_one.csv',index_col='人员编号').head()
    人员编号 姓名 国籍 性别 出生年 出生月 出生日
    1 aesfd 2 1942 8 10
    2 fasefa 5 1985 10 4
    3 aeagd 4 1946 10 15
    4 aef 4 1999 5 13
    5 eaf 1 2010 6 24

    练习二】
    现有一份半虚拟的数据集,第一列包含了新型冠状病毒的一些新闻标题,请解决以下问题:
    (a)选出所有关于北京市和上海市新闻标题的所在行。
    (b)求col2的均值。
    (c)求col3的均值。

    pd.read_csv('data/String_data_two.csv').head()
    col1 col2 col3
    0 鄂尔多斯市第2例确诊患者治愈出院 19 363.6923
    1 云南新增2例,累计124例 -67 -152.281
    2 武汉协和医院14名感染医护出院 -86 325.6221
    3 山东新增9例,累计307例 -74 -204.9313
    4 上海开学日期延至3月 -95 4.05
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: