亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Pandas 字符串操作

1. 前言

上一節我們學習了 Pandas 對于數值數據排序和排名操作,除了數值數據之外,字符串數據也是我們數據處理和分析中最常見到的數據之一,而對于字符串的處理成為了我們數據處理中一個重要的工作,Pandas 作為專業的數據處理分析工具,早就為用戶封裝好了各種字符串操作的函數,極大的提高了字符串處理的便捷和效率,接下來我們將打開 Pandas 字符串操作的大門,一起學習豐富且強大的字符串操作。

2. Pandas 字符串操作

Pandas 對字符串的操作是基于 Series 對象的 str 屬性,該屬性表示就是字符串對象,他下面封裝了多種字符串操作函數,正是通過這些函數,我們可以方便的處理字符串,值得注意的是,Pandas 中的這些操作函數是單獨封裝的,實現上不同于 python 語言自帶的字符串操作函數,使用起來更加的便捷,效率也更高。另外,Pandas 的 DataFrame 數據對象是不含該屬性的,因此也不具有相應的字符串操作函數,但是我們在實際應用中,往往會根據需要獲取 DataFrame 的數據子集返回 Series 數據對象,在通過 str 屬性進行字符串的操作。

Pandas 中提供了大量的字符串操作方法,我們這里依據是否影響字符串長度或內容,選取了 Pandas 庫中常用的一些字符串操作函數進行詳細講解。

**Tips:** 字符串中的操作函數,是區分大小寫的,這點在使用時要注意。

在講解之前,我們還是先把 Excel 中的數據做一下處理,方便我們后面各個函數操作效果的呈現。
圖片描述

解析后輸出的數據結果:

圖片描述

2.1 影響字符串長度或內容的函數

序號 函數 說明
1 str.split() 拆分字符串
2 str.slice() 按給定的位置截取字符串
3 str.strip() 刪除字符串中的空格或者換行符
4 str.lower() 將字符串轉換為小寫
5 str.upper() 將字符串轉換為大寫
6 str.cat() 連接字符串列
7 str.replace() 替換字符串中的元素
8 str.swapcase() 字符串中的大小寫互換

下面我們將通過代碼操作詳細介紹這幾個函數的使用方法:

1. split() 函數

該函數根據指定的元素分割字符串。

# 導入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)
# --- 輸出結果 ---
0    va
1    th
2      
3    @q
4     p
5    + 
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
2                 C
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
2                 c
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
2                 C
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
2                C
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 不影響字符串長度或內容的函數

序號 函數 說明
1 str.len() 計算字符串的長度
2 str.contains() 查詢字符串是否包含某個字符或子字符串
3 str.find() 查詢元素第一次在字符串中出現的位置
4 str.count() 查詢某個元素出現的次數
5 str.startswith() 查詢字符串是否以某個元素開頭
6 str.endswith() 查詢字符串是否以某個元素結尾
7 str.istitle() 查詢字符串是否首字母大寫其他都是小寫

下面我們將通過代碼操作詳細介紹這幾個函數的使用方法:

1. len() 函數

該函數用于返回字符串的的長度,包括空格和回車符。

# 導入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
3     6
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)
# --- 輸出結果 ---
0    0
1    2
2    0
3    1
4    0
5    0
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 庫常用的字符串操作函數的使用和注意事項。

圖片描述