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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 庫常用的字符串操作函數的使用和注意事項。