Pandas 字符串操作
1. 前言
上一節(jié)我們學習了 Pandas 對于數(shù)值數(shù)據(jù)排序和排名操作,除了數(shù)值數(shù)據(jù)之外,字符串數(shù)據(jù)也是我們數(shù)據(jù)處理和分析中最常見到的數(shù)據(jù)之一,而對于字符串的處理成為了我們數(shù)據(jù)處理中一個重要的工作,Pandas 作為專業(yè)的數(shù)據(jù)處理分析工具,早就為用戶封裝好了各種字符串操作的函數(shù),極大的提高了字符串處理的便捷和效率,接下來我們將打開 Pandas 字符串操作的大門,一起學習豐富且強大的字符串操作。
2. Pandas 字符串操作
Pandas 對字符串的操作是基于 Series 對象的 str 屬性,該屬性表示就是字符串對象,他下面封裝了多種字符串操作函數(shù),正是通過這些函數(shù),我們可以方便的處理字符串,值得注意的是,Pandas 中的這些操作函數(shù)是單獨封裝的,實現(xiàn)上不同于 python 語言自帶的字符串操作函數(shù),使用起來更加的便捷,效率也更高。另外,Pandas 的 DataFrame 數(shù)據(jù)對象是不含該屬性的,因此也不具有相應的字符串操作函數(shù),但是我們在實際應用中,往往會根據(jù)需要獲取 DataFrame 的數(shù)據(jù)子集返回 Series 數(shù)據(jù)對象,在通過 str 屬性進行字符串的操作。
Pandas 中提供了大量的字符串操作方法,我們這里依據(jù)是否影響字符串長度或內(nèi)容,選取了 Pandas 庫中常用的一些字符串操作函數(shù)進行詳細講解。
**Tips:** 字符串中的操作函數(shù),是區(qū)分大小寫的,這點在使用時要注意。
在講解之前,我們還是先把 Excel 中的數(shù)據(jù)做一下處理,方便我們后面各個函數(shù)操作效果的呈現(xiàn)。
解析后輸出的數(shù)據(jù)結(jié)果:
2.1 影響字符串長度或內(nèi)容的函數(shù)
序號 | 函數(shù) | 說明 |
---|---|---|
1 | str.split() | 拆分字符串 |
2 | str.slice() | 按給定的位置截取字符串 |
3 | str.strip() | 刪除字符串中的空格或者換行符 |
4 | str.lower() | 將字符串轉(zhuǎn)換為小寫 |
5 | str.upper() | 將字符串轉(zhuǎn)換為大寫 |
6 | str.cat() | 連接字符串列 |
7 | str.replace() | 替換字符串中的元素 |
8 | str.swapcase() | 字符串中的大小寫互換 |
下面我們將通過代碼操作詳細介紹這幾個函數(shù)的使用方法:
1. split() 函數(shù)
該函數(shù)根據(jù)指定的元素分割字符串。
# 導入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第16小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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() 函數(shù)
new_series=data["編程語言"]
split_res= new_series.str.split("@")
print(split_res)
# --- 輸出結(jié)果 ---
0 [java]
1 [python, 163.com]
2 [C]
3 [js, qq.com]
4 [php]
5 [C++ ]
Name: 編程語言, dtype: object
結(jié)果解析:首先我們獲得 DataFrame 的 “編程語言” 列,返回的數(shù)據(jù)結(jié)構(gòu)為 Series ,我們通過 str 屬性的 split () 函數(shù),傳入分割依據(jù)的字符,通過結(jié)果可以看到,存在 @ 字符的字符串均被分割成了多個子元素,返回結(jié)果也是由列表構(gòu)成的 Series 數(shù)據(jù)集。
2. slice() 函數(shù)
該函數(shù)根據(jù)給定開始和結(jié)束的下標位置,截取字符串,注意是左閉右開,不包含右邊的下標位置,該函數(shù)有三參數(shù):
- start :開始下標
- stop :結(jié)束下標
- step :步長
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# slice() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.slice(2,4)
print(slice_res)
# --- 輸出結(jié)果 ---
0 va
1 th
2
3 @q
4 p
5 +
Name: 編程語言, dtype: object
結(jié)果解析:這里我們指定 "編程語言" 列每個字符串從下標 2 截取到下標 4,因為下標是從 0 開始的,因此也就是截取每個字符串中第 3 和第 4 個字符,可以看到每個輸出的結(jié)果。
3. strip() 函數(shù)
該函數(shù)會去掉字符串中頭和尾的空格已經(jīng)換行符。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# strip() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.strip()
print(slice_res)
# --- 輸出結(jié)果 ---
0 java
1 python@163.com
2 C
3 js@qq.com
4 php
5 C++
Name: 編程語言, dtype: object
結(jié)果解析:通過輸出結(jié)果可以看到,“C++” 中原數(shù)據(jù)后面有空格在,使用函數(shù)操作后,空格被刪除。
4. lower() 函數(shù)
該函數(shù)用于將字符串中的所有大寫字母轉(zhuǎn)換為小寫字母。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# lower() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.lower()
print(slice_res)
# --- 輸出結(jié)果 ---
0 java
1 python@163.com
2 c
3 js@qq.com
4 php
5 c++
Name: 編程語言, dtype: object
結(jié)果解析:通過輸出結(jié)果可以看到,“編程語言” 列所有的大寫字母都轉(zhuǎn)換成了小寫。
5. upper() 函數(shù)
該函數(shù)用于將字符串中的所有小寫字母轉(zhuǎn)換為大寫字母。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# upper() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.upper()
print(slice_res)
# --- 輸出結(jié)果 ---
0 JAVA
1 PYTHON@163.COM
2 C
3 JS@QQ.COM
4 PHP
5 C++
Name: 編程語言, dtype: object
結(jié)果解析:通過輸出結(jié)果可以看到,"編程語言" 這一列所有的小寫字母均轉(zhuǎn)換為了大寫字母。
6. cat() 函數(shù)
該函數(shù)用于將兩列合并成一列數(shù)據(jù),前提是兩列都是字符,如果是數(shù)值的話會報錯。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# cat() 函數(shù)
new_series=data["編程語言"]
new_series_two=data["主要創(chuàng)始人"]
slice_res= new_series.str.cat(new_series_two)
print(slice_res)
# --- 輸出結(jié)果 ---
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
結(jié)果解析:通過 cat () 函數(shù),將 “編程語言” 和 “主要創(chuàng)始人” 兩列進行合并,可以看到輸出結(jié)果中的合并結(jié)果。
7. replace() 函數(shù)
該函數(shù)可用于替換字符串的內(nèi)容。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# replace() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.replace("com","cn")
print(slice_res)
# --- 輸出結(jié)果 ---
0 java
1 python@163.cn
2 C
3 js@qq.cn
4 php
5 C++
Name: 編程語言, dtype: object
結(jié)果解析:這里我們將 “編程語言” 列字符串中的 com 替換為 cn,通過輸出結(jié)果可以看到替換的效果。
8. swapcase() 函數(shù)
該函數(shù)用于將字符串中的大小寫進行相互轉(zhuǎn)換(大寫轉(zhuǎn)換為小寫,小寫轉(zhuǎn)換為大寫)。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# swapcase() 函數(shù)
new_series=data["主要創(chuàng)始人"]
slice_res= new_series.str.swapcase()
print(slice_res)
# --- 輸出結(jié)果 ---
0 jAMES gOSLING
1 gUIDO VAN rOSSUM\n
2 dENNIS mACaLISTAIR rITCHIE
3 bRENDAN eICH
4 rASMUS lERDORF
5 bJARNE sTROUSTRUP
Name: 主要創(chuàng)始人, dtype: object
結(jié)果解析:這里我們通過 swapcase 函數(shù)將 “主要創(chuàng)始人” 列中字符串的大小寫進行了互換,通過輸出結(jié)果可以看到互換的效果。
2.2 不影響字符串長度或內(nèi)容的函數(shù)
序號 | 函數(shù) | 說明 |
---|---|---|
1 | str.len() | 計算字符串的長度 |
2 | str.contains() | 查詢字符串是否包含某個字符或子字符串 |
3 | str.find() | 查詢元素第一次在字符串中出現(xiàn)的位置 |
4 | str.count() | 查詢某個元素出現(xiàn)的次數(shù) |
5 | str.startswith() | 查詢字符串是否以某個元素開頭 |
6 | str.endswith() | 查詢字符串是否以某個元素結(jié)尾 |
7 | str.istitle() | 查詢字符串是否首字母大寫其他都是小寫 |
下面我們將通過代碼操作詳細介紹這幾個函數(shù)的使用方法:
1. len() 函數(shù)
該函數(shù)用于返回字符串的的長度,包括空格和回車符。
# 導入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第16小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# len() 函數(shù)
new_series=data["主要創(chuàng)始人"]
slice_res= new_series.str.len()
print(slice_res)
# --- 輸出結(jié)果 ---
0 13
1 17
2 26
3 12
4 14
5 17
Name: 主要創(chuàng)始人, dtype: int64
結(jié)果解析:通過該函數(shù)可以輸出字符串的長度,“主要創(chuàng)始人” 列的第二個字符加上空格和回車符工 17 個字符,如果字符前后存在空格,也是加入計算的。
2. contains() 函數(shù)
該函數(shù)用于檢測字符串是否包含某個字符或者是子串,返回值為布爾型。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# contains() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.contains("com")
print(slice_res)
# --- 輸出結(jié)果 ---
0 False
1 True
2 False
3 True
4 False
5 False
Name: 編程語言, dtype: bool
結(jié)果解析:通過該函數(shù)檢測 “編程語言” 列,字符串是否含有子串 com ,該列只有第 2 行和第 4 行含有 com 子串,所以這兩行的檢測結(jié)果為 True,其他行為 False。
3. find() 函數(shù)
該函數(shù)用于檢測字符串中第一次出現(xiàn)某個子串或者字符的下標位置,如果不存在則返回為 -1。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# find() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.find("com")
print(slice_res)
# --- 輸出結(jié)果 ---
0 -1
1 11
2 -1
3 6
4 -1
5 -1
Name: 編程語言, dtype: int64
結(jié)果解析:通過該函數(shù)進行檢測,可以看到 “編程語言” 列中字符串出現(xiàn) com 子串的位置下標,第 2 行為 11,第 4 行為 6,其他行因為不存在該子串,所以返回 - 1。
4. count() 函數(shù)
該函數(shù)用于統(tǒng)計字符串中出現(xiàn)某個子串或者字符的次數(shù)。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# count() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.count("o")
print(slice_res)
# --- 輸出結(jié)果 ---
0 0
1 2
2 0
3 1
4 0
5 0
Name: 編程語言, dtype: int64
結(jié)果解析:通過該函數(shù)檢測 “編程語言” 列,各個字符串中出現(xiàn)字符 ‘o’ 的次數(shù),通過輸出結(jié)果可以看到每一個子串中該字符出現(xiàn)的次數(shù)。
5. startswith() 函數(shù)
該函數(shù)用于檢測字符串是否以某個字符或者子串開始,返回結(jié)果為布爾型。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# startswith() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.startswith("j")
print(slice_res)
# --- 輸出結(jié)果 ---
0 True
1 False
2 False
3 True
4 False
5 False
Name: 編程語言, dtype: bool
結(jié)果解析:通過該函數(shù),檢測 “編程語言” 列各個字符串是否以字符 ‘j’ 開始,可以看到輸出結(jié)果只有第 1 行和第 4 行是的。
6. endswith() 函數(shù)
該函數(shù)用于檢測字符串是否以某個字符或者子串結(jié)尾,返回結(jié)果為布爾型。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# endswith() 函數(shù)
new_series=data["編程語言"]
slice_res= new_series.str.endswith("p")
print(slice_res)
# --- 輸出結(jié)果 ---
0 False
1 False
2 False
3 False
4 True
5 False
Name: 編程語言, dtype: bool
# 結(jié)果解析:通過該函數(shù)對“編程語言”列的字符串進行檢測,是否以字符 'p' 結(jié)尾,通過輸出結(jié)果可以看到只有第5行的 "php" 是以該字符為結(jié)尾的,檢測結(jié)果為 True 。
7. istitle() 函數(shù)
該函數(shù)用于檢測字符串中每個單詞是否以大寫字符開頭,并且其他的字符均為小寫的內(nèi)容,這里要注意,檢測的單位是字符串中的每個單詞。
# --- 解析 data 數(shù)據(jù)結(jié)果 ---
編程語言 推出時間 價格 主要創(chuàng)始人
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 解析出來的數(shù)據(jù)
# istitle() 函數(shù)
new_series=data["主要創(chuàng)始人"]
slice_res= new_series.str.istitle()
print(slice_res)
# --- 輸出結(jié)果 ---
0 True
1 False
2 False
3 True
4 True
5 True
Name: 主要創(chuàng)始人, dtype: bool
結(jié)果解析:通過該函數(shù)檢測 “主要創(chuàng)始人” 列中各個字符串的每個單詞是否以大寫字母開頭,該單詞的其他字符為小寫,因為第 2 行字符串的 “van” 單詞不是以大寫字母開頭,所有為 False,第 3 行字符串的 “MacAlistair” 雖然是以大寫字符開頭,但是該單詞的其他字符不全是小寫,因此也是返回 False 。
3. 小結(jié)
本節(jié)課程我們主要學習了 Pandas 庫對于字符串的操作處理,Pandas 庫提供了大量的字符串操作函數(shù),我們這節(jié)課只是學習了部分常用的函數(shù)使用方法和注意事項,大家可以參考 Pandas 開發(fā)文檔,了解 pandas 庫提供的其他的字符串操作函數(shù)(開發(fā)文檔) 。本節(jié)課程的重點如下:
- Pandas 庫常用的字符串操作函數(shù)的使用和注意事項。