【Python】相當(dāng)全面的Pandas文本數(shù)據(jù)處理,干貨多多
pandas庫當(dāng)中文本數(shù)據(jù)的操作,希望大家再看完本篇文章之后會有不少的收獲,我們大致會講創(chuàng)建一個包含文本數(shù)據(jù)的DataFrame 常用處理文本數(shù)據(jù)的方法的總結(jié) 正則表達式與DataFrame內(nèi)部方法的結(jié)合
創(chuàng)建文本內(nèi)容的數(shù)據(jù)
我們先來創(chuàng)建一個包含文本數(shù)據(jù)的DataFrame,來供我們后面使用
import?pandas?as?pd
df?=?pd.DataFrame({
???"姓":?["李","王","戴",?"李",?"張"],
???"名":?["華","碩","建業(yè)",?"四",?"三"],
???"戶籍地址":?["?浙江省·寧波市?",?"???浙江省·杭州市????",?"??浙江省·麗水市??",?"??浙江省·衢州市?",?"??浙江省·湖州市???????????"],
???"微信ID":?["Tomoplplplut1248781",?"Smopopo857",?"Adahuhuifhhjfj",?"Tull1945121",?"ZPWERERTFD599557"],
???"郵箱地址":?["[email protected]",?"[email protected]",?"[email protected]",?"[email protected]",?"[email protected]"]
})
df
output
???姓???名??????????????????戶籍地址?????????????????微信ID???????????????郵箱地址
0??李???華??????????????浙江省·寧波市[email protected]
1??王???碩???????????浙江省·杭州市[email protected]
2??戴??建業(yè)?????????????浙江省·麗水市[email protected]
3??李???四??????????????浙江省·衢州市[email protected]
4??張???三????浙江省·湖州市[email protected]
常用處理文本數(shù)據(jù)的方法總結(jié)
Python當(dāng)中用來處理字符串?dāng)?shù)據(jù)的方法有很多,基本上都可以在DataFrame內(nèi)部拿來使用,例如lower()方法和upper()方法,給字母大小寫df["微信ID"].str.lower()
output
0????tomoplplplut1248781
1?????????????smopopo857
2?????????adahuhuifhhjfj
3????????????tull1945121
4???????zpwerertfd599557
Name:?微信ID,?dtype:?object
又譬如
df["微信ID"].str.len()
output
0????19
1????10
2????14
3????11
4????16
Name:?微信ID,?dtype:?int64
當(dāng)然我們看到戶籍地址這一列中的數(shù)據(jù)有很多的空格
df["戶籍地址"]
output
0????????????????浙江省·寧波市?
1?????????????浙江省·杭州市????
2???????????????浙江省·麗水市??
3????????????????浙江省·衢州市?
4??????浙江省·湖州市???????????
Name:?戶籍地址,?dtype:?object
我們可以使用處理字符串時的strip()方法
df["戶籍地址"].str.strip()
output
0????浙江省·寧波市
1????浙江省·杭州市
2????浙江省·麗水市
3????浙江省·衢州市
4????浙江省·湖州市
Name:?戶籍地址,?dtype:?object
與之相類似的還有lstrip()方法以及rstrip()方法,這里就不做贅述。
startswith()方法和endswith()方法也是用的非常的頻繁,例如我們想要挑選出戶籍地址是“寧波市”的數(shù)據(jù),df["戶籍地址"]?=?df["戶籍地址"].str.strip()
df[df["戶籍地址"].str.endswith("寧波市")]
output
???姓??名?????戶籍地址?????????????????微信ID??????????????郵箱地址
0??李??華??浙江省·寧波市[email protected]
另外我們還可以使用replace()方法來實現(xiàn)當(dāng)中的字符串的替換
df["戶籍地址"].str.replace("·",?"--")
output
0????浙江省--寧波市
1????浙江省--杭州市
2????浙江省--麗水市
3????浙江省--衢州市
4????浙江省--湖州市
Name:?戶籍地址,?dtype:?object
那既然用到了replace()方法,那么split()方法也可以嘗試一下
df["戶籍地址"].str.split("·")
output
0????[浙江省,?寧波市]
1????[浙江省,?杭州市]
2????[浙江省,?麗水市]
3????[浙江省,?衢州市]
4????[浙江省,?湖州市]
Name:?戶籍地址,?dtype:?object
spilit()方法的切割過之后就變成了列表的形式,然后可以通過get()方法或者[]來獲取里面的元素,例如df["戶籍地址"].str.split("·").str.get(0)
或者
df["戶籍地址"].str.split("·").str[0]
output
0????浙江省
1????浙江省
2????浙江省
3????浙江省
4????浙江省
Name:?戶籍地址,?dtype:?object
split()方法當(dāng)中添加expand=True這個參數(shù),來將上面列表形式的數(shù)據(jù)轉(zhuǎn)化成DataFrame格式df["戶籍地址"].str.split("·",?expand=True)
output
?????0????1
0??浙江省??寧波市
1??浙江省??杭州市
2??浙江省??麗水市
3??浙江省??衢州市
4??浙江省??湖州市
同樣地,我們可以在后面添加[]來獲取我們想要的元素
df["戶籍地址"].str.split("·",?expand=True)[1]
output
0????寧波市
1????杭州市
2????麗水市
3????衢州市
4????湖州市
Name:?1,?dtype:?object
正則表達式與DataFrame內(nèi)部方法的結(jié)合
two_groups?=?"([a-zA-Z]+)([0-9]+)"
df["微信ID"].str.extract(two_groups,?expand=True)
output
??????????????0????????1
0??Tomoplplplut??1248781
1???????Smopopo??????857
2???????????NaN??????NaN
3??????????Tull??1945121
4????ZPWERERTFD???599557
str方法后面添加索引,例如df["郵箱地址"].str[-8:]
output
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Name:?郵箱地址,?dtype:?object
two_groups?=?"([a-zA-Z]+)([0-9]+)"
df["微信ID"].str.match(two_groups)
output
0?????True
1?????True
2????False
3?????True
4?????True
Name:?微信ID,?dtype:?bool
False,不滿足字母+數(shù)字的規(guī)律,我們再進一步,將滿足條件的數(shù)據(jù)提取出來df[df["微信ID"].str.match(two_groups)]
output
???姓??名?????戶籍地址?????????????????微信ID???????????????郵箱地址
0??李??華??浙江省·寧波市[email protected]
1??王??碩??浙江省·杭州市[email protected]
3??李??四??浙江省·衢州市[email protected]
4??張??三??浙江省·湖州市[email protected]
針對文本數(shù)據(jù)而言,contains()方法也能夠派上用場,例如下面的數(shù)據(jù)
???姓???名??????????????????戶籍地址?????????????????微信ID???????????????郵箱地址
0??李???華??????????????浙江省·寧波市[email protected]
1??王???碩???????????浙江省·杭州市[email protected]
2??戴??建業(yè)?????????????浙江省·麗水市[email protected]
3??李???四??????????????浙江省·衢州市[email protected]
4??張???三????浙江省·湖州市[email protected]
5??黃???五???????????????浙江省·寧波市[email protected]
我們用contains()來提取出戶籍地址為“寧波市”的內(nèi)容,可以這么做
df[df["戶籍地址"].str.contains("寧波市")]
output
???姓??名?????戶籍地址?????????????????微信ID???????????????郵箱地址
0??李??華??浙江省·寧波市[email protected]
5??黃??五??浙江省·寧波市[email protected]
暫時就這些了,下一篇原創(chuàng)的文章安排在周天,非技術(shù)方面的,期待一下?
往期精彩回顧 本站qq群554839127,加入微信群請掃碼:
評論
圖片
表情
