• Pandas系列(四)-文本数据处理


    内容目录

    • 1. 为什么要用str属性
    • 2. 替换和分割
    • 3. 提取子串
      • 3.1 提取第一个匹配的子串
      • 3.2 匹配所有子串
      • 3.3 测试是否包含子串
      • 3.4 生成哑变量
      • 3.5 方法摘要

     一、为什么要用str属性?

    # 导入相关库
    import numpy as np
    import pandas as pd
    
    index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")
    data = {
        "age": [18, 30, np.nan, 40, np.nan, 30],
        "city": ["Bei Jing ", "Shang Hai ", "Guang Zhou", "Shen Zhen", np.nan, " "],
        "sex": [None, "male", "female", "male", np.nan, "unknown"],
        "birth": ["2000-02-10", "1988-10-17", None, "1978-08-08", np.nan, "1988-10-17"]
    }
    user_info = pd.DataFrame(data=data, index=index)
    # 将出生日期转为时间戳
    user_info["birth"] = pd.to_datetime(user_info.birth)
    user_info
    Out[203]: 
            age        city      sex      birth
    name                                       
    Tom    18.0   Bei Jing      None 2000-02-10
    Bob    30.0  Shang Hai      male 1988-10-17
    Mary    NaN  Guang Zhou   female        NaT
    James  40.0   Shen Zhen     male 1978-08-08
    Andy    NaN         NaN      NaN        NaT
    Alice  30.0              unknown 1988-10-17  

      在之前已经了解过,在对 Series 中每个元素处理时,我们可以使用 map 或 apply 方法。比如,我想要将每个城市都转为小写,可以使用如下的方式。

    In [3]: user_info.city.map(lambda x:x.lower())#报错
    -------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call las
    <ipython-input-3-d3c01aca317c> in <module>()
    ----> 1 user_info.city.map(lambda x:x.lower())#报错
    
    d:pytho3.6libsite-packagespandascoreseries.py in map(self, arg, na_
    
       2996         """
       2997         new_values = super(Series, self)._map_values(
    -> 2998             arg, na_action=na_action)
       2999         return self._constructor(new_values,
       3000                                  index=self.index).__finalize__(s
    
    d:pytho3.6libsite-packagespandascorease.py in _map_values(self, ma
    a_action)
       1002
       1003         # mapper is a function
    -> 1004         new_values = map_f(values, mapper)
       1005
       1006         return new_values
    
    pandas/_libs/srcinference.pyx in pandas._libs.lib.map_infer()
    
    <ipython-input-3-d3c01aca317c> in <lambda>(x)
    ----> 1 user_info.city.map(lambda x:x.lower())#报错
    
    AttributeError: 'float' object has no attribute 'lower'
    
    In [4]: user_info.city.str.lower()
    Out[4]:
    name
    Tom       bei jing
    Bob      shang hai
    Mary     guang zhou
    James     shen zhen
    Andy            NaN
    Alice
    Name: city, dtype: object
    
    In [5]: user_info.city.str.len()#字符串能用len,series,dataframe用size
    Out[5]:
    name
    Tom       9.0
    Bob      10.0
    Mary     10.0
    James     9.0
    Andy      NaN
    Alice     1.0
    Name: city, dtype: float64
    

    二、替换和分割

    使用 .srt 属性也支持替换与分割操作。
    先来看下替换操作,例如:将空字符串替换成下划线。
    replace 方法还支持正则表达式,例如将所有开头为 S 的城市替换为空字符串。
    再来看下分割操作,例如根据空字符串来分割某一列。
    分割列表中的元素可以使用 get 或 [] 符号进行访问:
    设置参数 expand=True 可以轻松扩展此项以返回 DataFrame。

    user_info.city.str.replace(' ','_')
    user_info.city.str.replace('^S.*','')
    user_info.city.str.split(" ")
    user_info.city.str.split(" ").str.get(0)
    user_info.city.str.split(" ").str[1]
    user_info.city.str.split(" ", expand=True)
    

    三、提取子串

      既然是在操作字符串,很自然,你可能会想到是否可以从一个长的字符串中提取出子串。答案是可以的。

    • 3.1 提取第一个匹配的子串

      extract 方法接受一个正则表达式并至少包含一个捕获组,指定参数 expand=True 可以保证每次都返回 DataFrame。
      例如,现在想要匹配空字符串前面的所有的字母,可以使用如下操作:如果使用多个组提取正则表达式会返回一个 DataFrame,每个组只有一列。

    In [6]: user_info.city.str.extract("(w+)s+", expand=True)
    Out[6]:
               0
    name
    Tom      Bei
    Bob    Shang
    Mary   Guang
    James   Shen
    Andy     NaN
    Alice    NaN

      例如,想要匹配出空字符串前面和后面的所有字母,操作如下

    In [7]: user_info.city.str.extract("(w+)s+(w+)", expand=True)
    Out[7]:
               0     1
    name
    Tom      Bei  Jing
    Bob    Shang   Hai
    Mary   Guang  Zhou
    James   Shen  Zhen
    Andy     NaN   NaN
    Alice    NaN   NaN
    • 3.2 匹配所有子串

      extract 只能够匹配出第一个子串,使用 extractall 可以匹配出所有的子串。
      例如,将所有组的空白字符串前面的字母都匹配出来,可以如下操作。

    In [8]: user_info.city.str.extractall("(w+)s+")
    Out[8]:
                     0
    name  match
    Tom   0        Bei
          1       Jing
    Bob   0      Shang
          1        Hai
    Mary  0      Guang
    James 0       Shen
    • 3.3 测试是否包含子串

    除了可以匹配出子串外,我们还可以使用 contains 来测试是否包含子串。例如,想要测试城市是否包含子串 “Zh”。

    In [9]: user_info.city.str.contains("Zh")
    Out[9]:
    name
    Tom      False
    Bob      False
    Mary      True
    James     True
    Andy       NaN
    Alice    False
    Name: city, dtype: object
    In [10]: user_info.city.str.contains("^S")
    Out[10]:
    name
    Tom      False
    Bob       True
    Mary     False
    James     True
    Andy       NaN
    Alice    False
    Name: city, dtype: object
    • 3.4 生成哑变量

    这是一个神奇的功能,通过 get_dummies 方法可以将字符串转为哑变量,sep 参数是指定哑变量之间的分隔符。来看看效果吧。

    In [11]: user_info.city.str.get_dummies(sep=" ")
    Out[11]:
           Bei  Guang  Hai  Jing  Shang  Shen  Zhen  Zhou
    name
    Tom      1      0    0     1      0     0     0     0
    Bob      0      0    1     0      1     0     0     0
    Mary     0      1    0     0      0     0     0     1
    James    0      0    0     0      0     1     1     0
    Andy     0      0    0     0      0     0     0     0
    Alice    0      0    0     0      0     0     0     0
    
    • 3.5 方法摘要  
    这里列出了一些常用的方法摘要。
    
    方法	描述
    cat()	连接字符串
    split()	在分隔符上分割字符串
    rsplit()	从字符串末尾开始分隔字符串
    get()	索引到每个元素(检索第i个元素)
    join()	使用分隔符在系列的每个元素中加入字符串
    get_dummies()	在分隔符上分割字符串,返回虚拟变量的DataFrame
    contains()	如果每个字符串都包含pattern / regex,则返回布尔数组
    replace()	用其他字符串替换pattern / regex的出现
    repeat()	重复值(s.str.repeat(3)等同于x * 3 t2 >)
    pad()	将空格添加到字符串的左侧,右侧或两侧
    center()	相当于str.center
    ljust()	相当于str.ljust
    rjust()	相当于str.rjust
    zfill()	等同于str.zfill
    wrap()	将长长的字符串拆分为长度小于给定宽度的行
    slice()	切分Series中的每个字符串
    slice_replace()	用传递的值替换每个字符串中的切片
    count()	计数模式的发生
    startswith()	相当于每个元素的str.startswith(pat)
    endswith()	相当于每个元素的str.endswith(pat)
    findall()	计算每个字符串的所有模式/正则表达式的列表
    match()	在每个元素上调用re.match,返回匹配的组作为列表
    extract()	在每个元素上调用re.search,为每个元素返回一行DataFrame,为每个正则表达式捕获组返回一列
    extractall()	在每个元素上调用re.findall,为每个匹配返回一行DataFrame,为每个正则表达式捕获组返回一列
    len()	计算字符串长度
    strip()	相当于str.strip
    rstrip()	相当于str.rstrip
    lstrip()	相当于str.lstrip
    partition()	等同于str.partition
    rpartition()	等同于str.rpartition
    lower()	相当于str.lower
    upper()	相当于str.upper
    find()	相当于str.find
    rfind()	相当于str.rfind
    index()	相当于str.index
    rindex()	相当于str.rindex
    capitalize()	相当于str.capitalize
    swapcase()	相当于str.swapcase
    normalize()	返回Unicode标准格式。相当于unicodedata.normalize
    translate()	等同于str.translate
    isalnum()	等同于str.isalnum
    isalpha()	等同于str.isalpha
    isdigit()	相当于str.isdigit
    isspace()	等同于str.isspace
    islower()	相当于str.islower
    isupper()	相当于str.isupper
    istitle()	相当于str.istitle
    isnumeric()	相当于str.isnumeric
    isdecimal()	相当于str.isdecimal
    

      

  • 相关阅读:
    北京东城区社保转出业务个人办理图解流程,需要的朋友可以参考
    微信自定义菜单代码实现
    那你就是不对称加密了
    数字签名和数字认证
    微信认证开发教程
    Eclipse配置Maven
    php随笔
    让SAE下的wordpress支持文件上传
    HTTP Header 详解
    浅谈JS DDoS攻击原理与防御
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/10513642.html
Copyright © 2020-2023  润新知