整章知識(shí)架構(gòu)
一贩疙、str對(duì)象
主要是對(duì)str對(duì)象的一些介紹沐兰,其中str對(duì)象可以使用[]進(jìn)行索引未辆,并且strin類型和object類型的索引結(jié)果不同。
二盒蟆、正則表達(dá)式基礎(chǔ)
需要將表中的內(nèi)容記牢,正則表達(dá)式匹配的是字符串的一種模式师骗,在寫正則表達(dá)式是历等,一定要準(zhǔn)確寫出和想要匹配字符串模式相同的正則表達(dá)式。
三辟癌、文本處理的五類操作
拆分
使用split函數(shù)對(duì)字符串進(jìn)行拆分寒屯,需要注意的是指定的分隔字符串會(huì)被丟棄。
s = pd.Series(['上海市黃浦區(qū)方浜中路249號(hào)', '上海市寶山區(qū)密山路5號(hào)'])
s.str.split('[市區(qū)路]')
合并
- join函數(shù)是使用某個(gè)連接符把
字符串列表
連接起來
s = pd.Series([['a','b'], [1, 'a'], [['a', 'b'], 'c']])
s.str.join('-')
- cat用于合并
兩個(gè)序列
黍少,可以指定連接的方式為left
,right
,outer
s1 = pd.Series(['a','b'])
s2 = pd.Series(['cat','dog'])
s2.index = [1, 2]
s1.str.cat(s2, sep='-', na_rep='?', join='outer')
匹配
contains和match都支持正則表達(dá)式寡夹,startswith和endswith不支持正則表達(dá)式
匹配
替換
當(dāng)需要對(duì)不同部分進(jìn)行有差別的替換時(shí),可以利用子組的方法厂置,并且此時(shí)可以通過傳入自定義的替換函數(shù)來分別進(jìn)行處理菩掏,注意group(k)代表匹配到的第k個(gè)子組(圓括號(hào)之間的內(nèi)容)
s = pd.Series(['上海市黃浦區(qū)方浜中路249號(hào)',
'上海市寶山區(qū)密山路5號(hào)',
'北京市昌平區(qū)北農(nóng)路2號(hào)'])
pat = '(\w+市)(\w+區(qū))(\w+路)(\d+號(hào))'
city = {'上海市': 'Shanghai', '北京市': 'Beijing'}
district = {'昌平區(qū)': 'CP District',
'黃浦區(qū)': 'HP District',
'寶山區(qū)': 'BS District'}
road = {'方浜中路': 'Mid Fangbin Road',
'密山路': 'Mishan Road',
'北農(nóng)路': 'Beinong Road'}
def my_func(m):
str_city = city[m.group(1)]
str_district = district[m.group(2)]
str_road = road[m.group(3)]
str_no = 'No. ' + m.group(4)[:-1]
return ' '.join([str_city,
str_district,
str_road,
str_no])
s.str.replace(pat, my_func)
可以使用
命名子組
的方式給子組命名,方式如下
pat = '(?P<group_name>repr)'
提取
extract
與extractall
的區(qū)別是前者只提取一次昵济,后者會(huì)嘗試多次提取智绸,findall
會(huì)將匹配結(jié)果放入列表返回
pat = '(?P<市名>\w+市)(?P<區(qū)名>\w+區(qū))(?P<路名>\w+路)(?P<編號(hào)>\d+號(hào))'
s.str.extract(pat)
四、常用字符串函數(shù)
字母型函數(shù)
主要是對(duì)字母大小寫的一些變換
數(shù)值型函數(shù)
將string轉(zhuǎn)換成數(shù)值访忿,errors
有三種類型可選瞧栗,downcast
可以指定轉(zhuǎn)換的類型為integer
,signed
醉顽,unsigned
沼溜,float
統(tǒng)計(jì)型函數(shù)
返回正則匹配的次數(shù)和字符串的長(zhǎng)度
s = pd.Series(['cat rat fat at', 'get feed sheet heat'])
s.str.count('[r|f]at|ee')
s.str.len()
格式型函數(shù)
格式型函數(shù)主要分為兩類,第一種是除空型游添,第二種時(shí)填充型系草。其中,第一類函數(shù)一共有三種唆涝,它們分別是strip, rstrip, lstrip找都,分別代表去除兩側(cè)空格、右側(cè)空格和左側(cè)空格廊酣。這些函數(shù)在數(shù)據(jù)清洗時(shí)是有用的能耻,特別是列名含有非法空格的時(shí)候。
五、練習(xí)
Ex1:房屋信息數(shù)據(jù)集
現(xiàn)有一份房屋信息數(shù)據(jù)集如下:
- 將
year
列改為整數(shù)年份存儲(chǔ)晓猛。 - 將
floor
列替換為Level, Highest
兩列饿幅,其中的元素分別為string
類型的層類別(高層、中層戒职、低層)與整數(shù)類型的最高層數(shù)栗恩。 - 計(jì)算房屋每平米的均價(jià)
avg_price
,以***元/平米
的格式存儲(chǔ)到表中洪燥,其中***
為整數(shù)磕秤。
# year列改為整數(shù)年分存儲(chǔ)
df.dropna(how = 'any', inplace=True) # 刪除無效項(xiàng)
df['year'] = pd.to_numeric(df['year'].str.extract('(?P<year>[0-9]{4})*').year, errors='ignore', downcast='integer')
df.head(3)
# floor替換為level,highest兩列
floor = df.floor.str.extract('(?P<Level>[^0-9]+[層]).*[共](?P<Highest>\d+)[層]')
# Highest轉(zhuǎn)化為整數(shù)類型
floor.Highest = pd.to_numeric(floor.Highest, errors='coerce', downcast='integer')
df = pd.concat([floor, df],axis=1)
df.drop(columns=['floor'], inplace=True)
df.head(3)
# 計(jì)算均價(jià)
aera = pd.to_numeric(df.area.str.extract('(?P<area>\d+.?\d+)').area, errors='coerce', downcast='float')
price = pd.to_numeric(df.price.str.extract('(?P<price>\d+)').price, errors='coerce', downcast='float')
avg_price = price / aera * 10000
avg_price.name = 'avg_price'
avg_price = avg_price.astype('int').astype('string') + '元/平米'
df = pd.concat([df, avg_price], axis=1)
df.head(3)
Ex2:《權(quán)力的游戲》劇本數(shù)據(jù)集
現(xiàn)有一份權(quán)力的游戲劇本數(shù)據(jù)集如下:
- 計(jì)算每一個(gè)
Episode
的臺(tái)詞條數(shù)捧韵。 - 以空格為單詞的分割符號(hào)市咆,請(qǐng)求出單句臺(tái)詞平均單詞量最多的前五個(gè)人。
- 若某人的臺(tái)詞中含有問號(hào)再来,那么下一個(gè)說臺(tái)詞的人即為回答者蒙兰。若上一人臺(tái)詞中含有
個(gè)問號(hào),則認(rèn)為回答者回答了
個(gè)問題其弊,請(qǐng)求出回答最多問題的前五個(gè)人癞己。
# 計(jì)算臺(tái)詞條數(shù)
df.columns = df.columns.str.strip()
df.groupby(['Season', 'Episode'])['Sentence'].count().head()
# 計(jì)算平均單詞量最多的前五個(gè)人
df.set_index('Name').Sentence.str.split().str.len().groupby('Name').mean().sort_values(ascending=False).head()
s.str.count('\?').groupby('Name').sum().sort_values(ascending=False).head()