API reference: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.capitalize.html
import pandas as pd
df = pd.DataFrame({
"姓": ["趙","錢","孫", "李", "周"],
"名": ["風","雨","雷", "電", "三"],
"家庭住址": [" 浙江省·寧波市 ", " 浙江省·杭州市 ", " 四川省·武侯區 ", " 湖南省·岳陽樓 ", " 湖南省·益陽市 "],
"微信ID": ["Tomoplplplut1248781", "Smopopo857", "Adahuhuifhhjfj", "Tull1945121", "ZPWERERTFD599557"],
"郵箱": ["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"]
})
print(df)
Python當中用來處理字符串數據的方法有很多,基本上都可以在DataFrame內部拿來使用,例如 lower() 方法和 upper() 方法,給字母轉大小寫。
# 字母轉大寫
print(df["微信ID"].str.upper())
# 計算字符長度
print(df["微信ID"].str.len())
# 截掉字符串兩端空格。還有lstrip(),rstrip()去除左右空格的。
# 方法裡加參數str.lstrip('8'), 截掉字符串左側的指定字符
print(df["家庭住址"].str.strip())
像普通字符串一樣截取
print(df["郵箱"].str[-10:])
''' 0 [email protected] 1 [email protected] 2 [email protected] 3 [email protected] 4 @gmail.com Name: 郵箱, dtype: object '''
開頭,結尾,包含
要先做去空處理
df[“家庭住址”] = df[“家庭住址”].str.strip()
# 戶口在湖南xxx
print(df[df["家庭住址"].str.startswith("湖南")])
''' 姓 名 家庭住址 微信ID 郵箱 3 李 電 湖南省·岳陽樓 Tull1945121 [email protected] 4 周 三 湖南省·益陽市 ZPWERERTFD599557 [email protected] '''
# 家庭在xxx市
print(df[df["家庭住址"].str.endswith("市")])
''' 姓 名 家庭住址 微信ID 郵箱 0 趙 風 浙江省·寧波市 Tomoplplplut1248781 [email protected] 1 錢 雨 浙江省·杭州市 Smopopo857 [email protected] 4 周 三 湖南省·益陽市 ZPWERERTFD599557 [email protected] '''
# 家庭地址有“陽”這個字的
print(df[df["家庭地址"].str.contains("陽")])
''' 姓 名 家庭住址 微信ID 郵箱 3 李 電 湖南省·岳陽樓 Tull1945121 [email protected] 4 周 三 湖南省·益陽市 ZPWERERTFD599557 [email protected] '''
替換,分割
要先做去空處理
df[“家庭住址”] = df[“家庭住址”].str.strip()
df["家庭住址"] = df["家庭住址"].str.replace("·", "--")
print(df)
''' 姓 名 家庭住址 微信ID 郵箱 0 趙 風 浙江省--寧波市 Tomoplplplut1248781 [email protected] 1 錢 雨 浙江省--杭州市 Smopopo857 [email protected] 2 孫 雷 四川省--武侯區 Adahuhuifhhjfj [email protected] 3 李 電 湖南省--岳陽樓 Tull1945121 [email protected] 4 周 三 湖南省--益陽市 ZPWERERTFD599557 [email protected] '''
print(df["家庭住址"].str.split("·"))
''' 0 [浙江省, 寧波市] 1 [浙江省, 杭州市] 2 [四川省, 武侯區] 3 [湖南省, 岳陽樓] 4 [湖南省, 益陽市] Name: 家庭地址, dtype: object '''
在經過spilit()方法的切割過之後就變成了列表的形式,然後可以通過get()方法或者 [ ] 來獲取裡面的元素,例如
print(df["家庭住址"].str.split("·").str.get(0))
print(df["家庭住址"].str.split("·").str[0])
''' 0 浙江省 1 浙江省 2 四川省 3 湖南省 4 湖南省 Name: 家庭住址, dtype: object '''
當然我們也可以在split()方法當中添加expand=True這個參數,來將上面列表形式的數據轉化成DataFrame格式
print(df["家庭住址"].str.split("·", expand=True))
''' 0 1 0 浙江省 寧波市 1 浙江省 杭州市 2 四川省 武侯區 3 湖南省 岳陽樓 4 湖南省 益陽市 '''
同樣地,我們可以在後面添加[]來獲取我們想要的元素
print(df["家庭住址"].str.split("·", expand=True)[1])
''' 0 寧波市 1 杭州市 2 武侯區 3 岳陽樓 4 益陽市 Name: 1, dtype: object '''
獲取郵箱類型
print(df["郵箱"].str.split("@").str.get(1).str.split(".").str.get(0))
print(df["郵箱"].str.split("@").str[1].str.rstrip(".com"))
''' 0 163 1 qq 2 126 3 139 4 gmail Name: 郵箱, dtype: object '''
提取“微信ID”這一列當中的字母和數字,並且將兩者分開來
wq = "([a-zA-Z]+)([0-9]+)"
print(df["微信ID"].str.extract(wq, expand=True))
# 也可以單獨獲取
print(df["微信ID"].str.extract("([a-zA-Z]+)", expand=True))
print(df["微信ID"].str.extract("([0-9]+)", expand=True))
''' 0 1 0 Tomoplplplut 1248781 1 Smopopo 857 2 NaN NaN 3 Tull 1945121 4 ZPWERERTFD 599557 '''
從另外一個角度看,正則表達式也可以幫助我們確認文本數據是否符合某種規律
wq = "([a-zA-Z]+)([0-9]+)"
print(df["微信ID"].str.match(wq))
''' 0 True 1 True 2 False 3 True 4 True Name: 微信ID, dtype: bool '''
第三行為False,說明它不滿足字母+數字的規律。我們再進一步,將滿足條件的數據提取出來;若是取反,那就表示提取的數據就是不滿足規律的。
wq = "([a-zA-Z]+)([0-9]+)"
print(df[df["微信ID"].str.match(wq)])
print(~df[df["微信ID"].str.match(wq)])
''' 姓 名 家庭住址 微信ID 郵箱 0 趙 風 浙江省·寧波市 Tomoplplplut1248781 [email protected] 1 錢 雨 浙江省·杭州市 Smopopo857 [email protected] 3 李 電 湖南省·岳陽樓 Tull1945121 [email protected] 4 周 三 湖南省·益陽市 ZPWERERTFD599557 [email protected] '''
''' 姓 名 家庭住址 微信ID 郵箱 2 孫 雷 四川省·武侯區 Adahuhuifhhjfj [email protected] '''