添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Pandas 字符串操作

1. 前言

上一节我们学习了 Pandas 对于数值数据排序和排名操作,除了数值数据之外,字符串数据也是我们数据处理和分析中最常见到的数据之一,而对于字符串的处理成为了我们数据处理中一个重要的工作,Pandas 作为专业的数据处理分析工具,早就为用户封装好了各种字符串操作的函数,极大的提高了字符串处理的便捷和效率,接下来我们将打开 Pandas 字符串操作的大门,一起学习丰富且强大的字符串操作。

2. Pandas 字符串操作

Pandas 对字符串的操作是基于 Series 对象的 str 属性,该属性表示就是字符串对象,他下面封装了多种字符串操作函数,正是通过这些函数,我们可以方便的处理字符串,值得注意的是,Pandas 中的这些操作函数是单独封装的,实现上不同于 python 语言自带的字符串操作函数,使用起来更加的便捷,效率也更高。另外,Pandas 的 DataFrame 数据对象是不含该属性的,因此也不具有相应的字符串操作函数,但是我们在实际应用中,往往会根据需要获取 DataFrame 的数据子集返回 Series 数据对象,在通过 str 属性进行字符串的操作。

Pandas 中提供了大量的字符串操作方法,我们这里依据是否影响字符串长度或内容,选取了 Pandas 库中常用的一些字符串操作函数进行详细讲解。

**Tips:** 字符串中的操作函数,是区分大小写的,这点在使用时要注意。

在讲解之前,我们还是先把 Excel 中的数据做一下处理,方便我们后面各个函数操作效果的呈现。

解析后输出的数据结果:

2.1 影响字符串长度或内容的函数

# 导入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第16小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)
# --- 输出结果 ---
             编程语言     推出时间    价格          主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup
# split() 函数
new_series=data["编程语言"]
split_res= new_series.str.split("@")
print(split_res)
# --- 输出结果 ---
0               [java]
1    [python, 163.com]
2                  [C]
3         [js, qq.com]
4                [php]
5        [C++        ]
Name: 编程语言, dtype: object

结果解析 :首先我们获得 DataFrame 的 “编程语言” 列,返回的数据结构为 Series ,我们通过 str 属性的 split () 函数,传入分割依据的字符,通过结果可以看到,存在 @ 字符的字符串均被分割成了多个子元素,返回结果也是由列表构成的 Series 数据集。

2. slice() 函数

该函数根据给定开始和结束的下标位置,截取字符串,注意是左闭右开,不包含右边的下标位置,该函数有三参数:

  • start :开始下标
  • stop :结束下标
  • step :步长
  • # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格            主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustru
    # data 解析出来的数据
    # slice() 函数
    new_series=data["编程语言"]
    slice_res= new_series.str.slice(2,4)
    print(slice_res)
    # --- 输出结果 ---
    Name: 编程语言, dtype: object
    

    结果解析 :这里我们指定 "编程语言" 列每个字符串从下标 2 截取到下标 4,因为下标是从 0 开始的,因此也就是截取每个字符串中第 3 和第 4 个字符,可以看到每个输出的结果。

    3. strip() 函数

    该函数会去掉字符串中头和尾的空格已经换行符。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格            主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustru
    # data 解析出来的数据
    # strip() 函数
    new_series=data["编程语言"]
    slice_res= new_series.str.strip()
    print(slice_res)
    # --- 输出结果 ---
    0              java
    1    python@163.com
    3         js@qq.com
    4               php
    5               C++
    Name: 编程语言, dtype: object
    

    结果解析 :通过输出结果可以看到,“C++” 中原数据后面有空格在,使用函数操作后,空格被删除。

    4. lower() 函数

    该函数用于将字符串中的所有大写字母转换为小写字母。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格            主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustru
    # data 解析出来的数据
    # lower() 函数
    new_series=data["编程语言"]
    slice_res= new_series.str.lower() 
    print(slice_res)
    # --- 输出结果 ---
    0              java
    1    python@163.com
    3         js@qq.com
    4               php
    5       c++        
    Name: 编程语言, dtype: object
    

    结果解析:通过输出结果可以看到,“编程语言” 列所有的大写字母都转换成了小写。

    5. upper() 函数

    该函数用于将字符串中的所有小写字母转换为大写字母。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格            主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2
    
    
    
    
        
                   C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustru
    # data 解析出来的数据
    # upper() 函数
    new_series=data["编程语言"]
    slice_res= new_series.str.upper() 
    print(slice_res)
    # --- 输出结果 ---
    0              JAVA
    1    PYTHON@163.COM
    3         JS@QQ.COM
    4               PHP
    5       C++        
    Name: 编程语言, dtype: object
    

    结果解析 :通过输出结果可以看到,"编程语言" 这一列所有的小写字母均转换为了大写字母。

    6. cat() 函数

    该函数用于将两列合并成一列数据,前提是两列都是字符,如果是数值的话会报错。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格                       主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # cat() 函数
    new_series=data["编程语言"]
    new_series_two=data["主要创始人"]
    slice_res= new_series.str.cat(new_series_two) 
    print(slice_res)
    # --- 输出结果 ---
    0                   javaJames Gosling
    1    python@163.comGuido van Rossum\n
    2         CDennis MacAlistair Ritchie
    3               js@qq.comBrendan Eich
    4                   phpRasmus Lerdorf
    5        C++        Bjarne Stroustrup
    Name: 编程语言, dtype: object
    

    结果解析 :通过 cat () 函数,将 “编程语言” 和 “主要创始人” 两列进行合并,可以看到输出结果中的合并结果。

    7. replace() 函数

    该函数可用于替换字符串的内容。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格                       主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # replace() 函数
    new_series=data["编程语言"]
    slice_res= new_series.str.replace("com","cn") 
    print(slice_res)
    # --- 输出结果 ---
    0             java
    1    python@163.cn
    3         js@qq.cn
    4              php
    5      C++        
    Name: 编程语言, dtype: object
    

    结果解析 :这里我们将 “编程语言” 列字符串中的 com 替换为 cn,通过输出结果可以看到替换的效果。

    8. swapcase() 函数

    该函数用于将字符串中的大小写进行相互转换(大写转换为小写,小写转换为大写)。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格            主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # swapcase() 函数
    new_series=data["主要创始人"]
    slice_res= new_series.str.swapcase() 
    print(slice_res)
    # --- 输出结果 ---
    0                 jAMES gOSLING
    1            gUIDO VAN rOSSUM\n
    2    dENNIS mACaLISTAIR rITCHIE
    3                  bRENDAN eICH
    4                rASMUS lERDORF
    5             bJARNE sTROUSTRUP
    Name: 主要创始人, dtype: object
    

    结果解析 :这里我们通过 swapcase 函数将 “主要创始人” 列中字符串的大小写进行了互换,通过输出结果可以看到互换的效果。

    2.2 不影响字符串长度或内容的函数

    # 导入pandas包
    import pandas as pd
    data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第16小节/execl数据demo.xlsx"
    # 解析数据
    data = pd.read_excel(data_path)
    print(data)
    # --- 输出结果 ---
                 编程语言     推出时间    价格                       主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # len() 函数
    new_series=data["主要创始人"]
    slice_res= new_series.str.len() 
    print(slice_res)
    # --- 输出结果 ---
    0    13
    1    17
    2    26
    3    12
    4    14
    5    17
    Name: 主要创始人, dtype: int64
    

    结果解析 :通过该函数可以输出字符串的长度,“主要创始人” 列的第二个字符加上空格和回车符工 17 个字符,如果字符前后存在空格,也是加入计算的。

    2. contains() 函数

    该函数用于检测字符串是否包含某个字符或者是子串,返回值为布尔型。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格                       主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # contains() 函数
    new_series=data["编程语言"]
    slice_res= new_series.str.contains("com") 
    print(slice_res)
    # --- 输出结果 ---
    0    False
    1     True
    2    False
    3     True
    4    False
    5    False
    Name: 编程语言, dtype: bool
    

    结果解析 :通过该函数检测 “编程语言” 列,字符串是否含有子串 com ,该列只有第 2 行和第 4 行含有 com 子串,所以这两行的检测结果为 True,其他行为 False。

    3. find() 函数

    该函数用于检测字符串中第一次出现某个子串或者字符的下标位置,如果不存在则返回为 -1。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格                       主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # find() 函数
    new_series=data["编程语言"]
    slice_res= new_series.
    
    
    
    
        
    str.find("com") 
    print(slice_res)
    # --- 输出结果 ---
    0    -1
    1    11
    2    -1
    4    -1
    5    -1
    Name: 编程语言, dtype: int64
    

    结果解析 :通过该函数进行检测,可以看到 “编程语言” 列中字符串出现 com 子串的位置下标,第 2 行为 11,第 4 行为 6,其他行因为不存在该子串,所以返回 - 1。

    4. count() 函数

    该函数用于统计字符串中出现某个子串或者字符的次数。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格                       主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # count() 函数
    new_series=data["编程语言"]
    slice_res= new_series.str.count("o") 
    print(slice_res)
    # --- 输出结果 ---
    Name: 编程语言, dtype: int64
    

    结果解析 :通过该函数检测 “编程语言” 列,各个字符串中出现字符 ‘o’ 的次数,通过输出结果可以看到每一个子串中该字符出现的次数。

    5. startswith() 函数

    该函数用于检测字符串是否以某个字符或者子串开始,返回结果为布尔型。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格          主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # startswith() 函数
    new_series=data["编程语言"]
    slice_res= new_series.str.startswith("j") 
    print(slice_res)
    # --- 输出结果 ---
    0     True
    1    False
    2    False
    3     True
    4    False
    5    False
    Name: 编程语言, dtype: bool
    

    结果解析 :通过该函数,检测 “编程语言” 列各个字符串是否以字符 ‘j’ 开始,可以看到输出结果只有第 1 行和第 4 行是的。

    6. endswith() 函数

    该函数用于检测字符串是否以某个字符或者子串结尾,返回结果为布尔型。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格          主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # endswith() 函数
    new_series=data["编程语言"]
    slice_res= new_series.str.endswith("p") 
    print(slice_res)
    # --- 输出结果 ---
    0    False
    1    False
    2    False
    3    False
    4     True
    5    False
    Name: 编程语言, dtype: bool
    # 结果解析:通过该函数对“编程语言”列的字符串进行检测,是否以字符 'p' 结尾,通过输出结果可以看到只有第5行的 "php" 是以该字符为结尾的,检测结果为 True 。        
    

    7. istitle() 函数

    该函数用于检测字符串中每个单词是否以大写字符开头,并且其他的字符均为小写的内容,这里要注意,检测的单位是字符串中的每个单词。

    # --- 解析 data 数据结果 ---
                 编程语言     推出时间    价格          主要创始人
    0            java    199545.6               James Gosling
    1  python@163.com    199167.0          Guido van Rossum\n
    2               C    197233.9  Dennis MacAlistair Ritchie
    3       js@qq.com    199559.5                Brendan Eich
    4             php  2012年\n  69.9              Rasmus Lerdorf
    5     C++            198375.0           Bjarne Stroustrup
    # data 解析出来的数据
    # istitle() 函数
    new_series=data["主要创始人"]
    slice_res= new_series.str.istitle() 
    print(slice_res)
    # --- 输出结果 ---
    0     True
    1    False
    2    False
    3     True
    4     True
    5     True
    Name: 主要创始人, dtype: bool
    

    结果解析 :通过该函数检测 “主要创始人” 列中各个字符串的每个单词是否以大写字母开头,该单词的其他字符为小写,因为第 2 行字符串的 “van” 单词不是以大写字母开头,所有为 False,第 3 行字符串的 “MacAlistair” 虽然是以大写字符开头,但是该单词的其他字符不全是小写,因此也是返回 False 。

    3. 小结

    本节课程我们主要学习了 Pandas 库对于字符串的操作处理,Pandas 库提供了大量的字符串操作函数,我们这节课只是学习了部分常用的函数使用方法和注意事项,大家可以参考 Pandas 开发文档,了解 pandas 库提供的其他的字符串操作函数( 开发文档 ) 。本节课程的重点如下:

  • Pandas 库常用的字符串操作函数的使用和注意事项。
  •