入门Pandas不可不知的技巧
來(lái)源:Python數(shù)據(jù)之道
作者:Peter ?整理:陽(yáng)哥
今天來(lái)跟大家分享 Pandas 的一些常用知識(shí)點(diǎn),文章內(nèi)容由公眾號(hào)讀者 Peter 創(chuàng)作。
如果你用 Python 做數(shù)據(jù)分析,必然會(huì)繞不過(guò) Pandas 的使用,實(shí)際上, Python 也是由于 numpy、pandas 等數(shù)據(jù)科學(xué)庫(kù)的出現(xiàn),才開(kāi)始在數(shù)據(jù)科學(xué)領(lǐng)域?qū)崿F(xiàn)了快速的發(fā)展,因此,學(xué)好 Pandas 有很重要的現(xiàn)實(shí)意義。
本文總結(jié)自己經(jīng)常使用的pandas操作方法:
創(chuàng)建DataFrame數(shù)據(jù)
查看數(shù)據(jù)相關(guān)信息
查看頭尾文件
花樣取數(shù)
切片取數(shù)
常見(jiàn)函數(shù)使用
首先,導(dǎo)入包
import?pandas?as?pd import?numpy?as?np01 創(chuàng)建DataFrame數(shù)據(jù)
方式1:通過(guò)字典直接創(chuàng)建
df1?=?pd.DataFrame({"name":["小明","小紅","小孫","王小","關(guān)宇","劉蓓","張菲"],"age":[20,18,27,20,28,18,25],"sex":["男","女","男","男","男","女","女"],"score":[669,570,642,590,601,619,701],"address":["北京","深圳","廣州","武漢","深圳","廣州","長(zhǎng)沙"] })df1數(shù)據(jù)如下圖:
方式2:通過(guò)本地?cái)?shù)據(jù)讀取
從本地文件中讀取進(jìn)來(lái)。現(xiàn)在本地有一個(gè)文件:學(xué)生信息.xlsx直接通過(guò)pd.read_excel()讀進(jìn)來(lái):
df2?=?pd.read_excel("學(xué)生信息.xlsx") df2可以看到效果和上面是一樣的
02 數(shù)據(jù)探索
查看數(shù)據(jù)shape
shape表示數(shù)據(jù)是由多少行和列組成:
df1.shape??#?(7,5)查看字段屬性名稱
df1.columns查看屬性的數(shù)據(jù)類型
df1.dtypes可以看到只有兩種數(shù)據(jù)類型:int64和object
查看數(shù)據(jù)是否缺失
df1.isnull()???#?如果缺失顯示為True,否則顯示False df1.isnull().sum()?#?統(tǒng)計(jì)缺失值的個(gè)數(shù)。一個(gè)True計(jì)數(shù)一次結(jié)果顯示:本次數(shù)據(jù)是沒(méi)有缺失值的
查看數(shù)據(jù)行索引
df1.index查看數(shù)據(jù)描述信息
df1.describe查看數(shù)據(jù)統(tǒng)計(jì)值
統(tǒng)計(jì)值信息只會(huì)顯示類型為數(shù)值型的數(shù)據(jù)統(tǒng)計(jì)值信息:
df1.describe()統(tǒng)計(jì)值的結(jié)果包含:個(gè)數(shù)count、均值mean、方差std、最值min\max、四分位數(shù)25%、中位數(shù)50%、四分之三分位數(shù)75%。
03 查看頭尾文件
通過(guò)head和tail方法能夠快速查看數(shù)據(jù)的頭尾文件。
head
df1.head()???#?默認(rèn)是查看前5行數(shù)據(jù) df1.head(3)??#?指定顯示的行數(shù)tail
df1.tail()????#?默認(rèn)尾部5行 df1.tail(3)???#?指定尾部3行數(shù)據(jù)04 花樣取數(shù)
從pandas的DataFrame數(shù)據(jù)框中取出我們想要的數(shù)據(jù),然后進(jìn)行處理
取出某個(gè)字段的數(shù)據(jù)
我們?nèi)〕鰊ame這列的數(shù)據(jù):
name?=?df1["name"] name#?結(jié)果 0????小明 1????小紅 2????小孫 3????王小 4????關(guān)宇 5????劉蓓 6????張菲 Name:?name,?dtype:?object取出多個(gè)字段的數(shù)據(jù)
比如我們?nèi)〕鰊ame和age列的數(shù)據(jù):
name_age?=?df1[["name","age"]]?? name_age#?結(jié)果name?age 0?小明?20 1?小紅?18 2?小孫?27 3?王小?20 4?關(guān)宇?28 5?劉蓓?18 6?張菲?25根據(jù)字段類型選擇數(shù)據(jù)
比如,我們想選擇字段類型為int64的數(shù)據(jù),通過(guò)查看的字段數(shù)據(jù)類型顯示:age和score都是int64類型
1、選擇單個(gè)數(shù)據(jù)類型
#?1、選擇單個(gè)數(shù)據(jù)類型df1.select_dtypes(include='int64')#?結(jié)果age?score 0?20?669 1?18?570 2?27?642 3?20?590 4?28?601 5?18?619 6?25?7012、同時(shí)選擇多個(gè)類型
df1.select_dtypes(include=['int64','object'])#?結(jié)果name??age?sex?score?address 0?小明??20??男?669????北京 1?小紅??18??女?570????深圳 2?小孫??27??男?642????廣州 3?王小??20??男?590????武漢 4?關(guān)宇??28??男?601????深圳 5?劉蓓??18??女?619????廣州 6?張菲??25??女?701????長(zhǎng)沙因?yàn)閿?shù)據(jù)中只有int64,object,所以我們?nèi)窟x出來(lái)了。
3、選擇排除某些數(shù)據(jù)類型之外的數(shù)據(jù):
#?選擇除了int64類型之外的數(shù)據(jù) #?排除name和score字段之外的數(shù)據(jù) df1.select_dtypes(exclude='int64')?#?結(jié)果name?sex?address 0?小明?男???北京 1?小紅?女???深圳 2?小孫?男???廣州 3?王小?男???武漢 4?關(guān)宇?男???深圳 5?劉蓓?女???廣州 6?張菲?女???長(zhǎng)沙根據(jù)數(shù)值大小取數(shù)
1、直接通過(guò)判斷大小來(lái)取數(shù):
df1[df1["age"]?==?20]??#?年齡等于20 df1[df1["age"]?!=?20]??#?年齡不等于20 df1[df1["age"]?>=?20]??#?年齡大于等于202、多個(gè)判斷條件連用
第一次使用上面的方法報(bào)錯(cuò):關(guān)鍵詞是ambiguous。判斷條件很讓pandas混淆,改成下面的寫(xiě)法成功解決:
df1[(df1["age"]?>=?20)?&?(df1["age"]?<?27)]根據(jù)字符串取數(shù)
1、通過(guò)單個(gè)條件取數(shù)
#?1、單條數(shù)據(jù) df1[df1["name"]?==?"小明"]??#?結(jié)果name??age?sex??score?address 0?小明??20??男???669???北京2、通過(guò)多個(gè)條件取數(shù)
選擇姓名是小明,或者年齡大于25的數(shù)據(jù)
df1[(df1["name"]?==?"小明")?|?(df1["age"]?>?25)]#?結(jié)果name??age?sex??score?address 0?小明??20??男??669???北京 2?小孫??27??男??642???廣州 4?關(guān)宇??28??男??601???深圳3、字符串的開(kāi)始、結(jié)尾、包含函數(shù)
str.startswith(string)
str.endswith(string)
str.contains(string)
上面的王小不是小開(kāi)頭,但是包含小,所以也被選出來(lái)。
4、字符串取反操作
取反符號(hào)是波浪線:~
下面的例子是:取出名字name中不包含小的數(shù)據(jù),只有3個(gè)人名字中沒(méi)有小字。
#?取出不包含小的數(shù)據(jù) df1[~df1["name"].str.contains("小")]#?結(jié)果name??age?sex??score?address 4?關(guān)宇??28??男??601???深圳 5?劉蓓??18??女??619???廣州 6?張菲??25??女??701???長(zhǎng)沙05 切片取數(shù)
切片是Python中存在的概念,在pandas中同樣可以使用。切片中存在3個(gè)概念:start、stop、step
start:起始索引,包含
stop:結(jié)束索引,不包含
step:步長(zhǎng),可正可負(fù);
寫(xiě)法為:[start:stop:step]
步長(zhǎng)為正數(shù)
1、通過(guò)下面的3個(gè)案例說(shuō)明:起始索引默認(rèn)從0開(kāi)始,步長(zhǎng)默認(rèn)是1
2、指定起始索引,不指定結(jié)束索引,表示一直取到數(shù)據(jù)末尾
df1[4:]??#?從索引4開(kāi)始取到末尾#?結(jié)果name??age?sex??score?address 4?關(guān)宇??28??男??601???深圳 5?劉蓓??18??女??619???廣州 6?張菲??25??女??701???長(zhǎng)沙3、改變步長(zhǎng)的值
df1[0:4:2]??#?改變步長(zhǎng):每隔2個(gè)值取一行數(shù)據(jù)#?結(jié)果name??age?sex??score?address 0?小明??20??男???669???北京 2?小孫??27??男???642???廣州上面的例子不指定起始索引:
df1[:4:2]??#?默認(rèn)從0開(kāi)始4、只指定步長(zhǎng)
df1[::2]???#?從頭到尾,步長(zhǎng)為2#?結(jié)果name??age?sex??score?address 0?小明??20??男???669???北京 2?小孫??27??男??642???廣州 4?關(guān)宇??28??男??601???深圳 6?張菲??25??女??701???長(zhǎng)沙步長(zhǎng)為負(fù)數(shù)
1、步長(zhǎng)為-1,默認(rèn)是倒序輸出結(jié)果
df1[::-1]??#?倒序輸出#?結(jié)果name??age?sex??score?address 6??張菲???25?女????701??長(zhǎng)沙 5??劉蓓???18?女????619??廣州 4??關(guān)宇???28?男????601??深圳 3??王小???20?男????590??武漢 2??小孫???27?男????642??廣州 1??小紅???18?女????570??深圳 0??小明???20?男????669??北京2、步長(zhǎng)為負(fù),指定起始和終止索引,起始索引大于終止索引
df1[4:0:-1]name??age?sex??score?address 4?關(guān)宇??28??男???601???深圳 3?王小??20??男???590???武漢 2?小孫??27??男???642???廣州 1?小紅??18??女???570???深圳3、起始和終止索引為負(fù)數(shù)
df1[-1:-5:-1]??#?最后一行記錄索引為-1,不包含索引為-5的數(shù)據(jù)name??age?sex??score?address 6?張菲?25?女????701??長(zhǎng)沙 5?劉蓓?18?女????619??廣州 4?關(guān)宇?28?男????601??深圳 3?王小?20?男????590??武漢06 常用函數(shù)
統(tǒng)計(jì)元素個(gè)數(shù)
很多時(shí)候我們需要統(tǒng)計(jì)某個(gè)列中每個(gè)元素出現(xiàn)的個(gè)數(shù),相當(dāng)于是做詞頻統(tǒng)計(jì),使用:value_counts()方法,具體案例為:
??:新數(shù)據(jù)中df1增加了一列:班級(jí)class,后續(xù)有作用
比如我們想統(tǒng)計(jì)每個(gè)城市出現(xiàn)了多少次:
#?統(tǒng)計(jì)中每個(gè)城市各出現(xiàn)了多少次address?=?df1["address"].value_counts() address結(jié)果自動(dòng)是降序排列的Series類型數(shù)據(jù)
索引重置
索引重置使用reset_index():
address_new?=?address.reset_index() address_new還比如我們想從數(shù)據(jù)中單獨(dú)取出sex="男"的數(shù)據(jù):
fale?=?df1[df1["sex"]?==?"男"] fale我們觀察到數(shù)據(jù)前面的索引還是原來(lái)的,但是我們希望的是從0開(kāi)始顯示,比較符合我們的習(xí)慣:
fale_1?=?fale.reset_index() fale_1出現(xiàn)的結(jié)果中索引是我們想要的結(jié)果,但是出現(xiàn)了一列新的數(shù)據(jù),就是原來(lái)的索引構(gòu)成的數(shù)據(jù),這不是我們想要的數(shù)據(jù),需要去除:
fale_1?=?fale.reset_index(drop=True)??#?加上參數(shù)即可解決 fale_1屬性重命名
使用的是rename函數(shù),傳入columsn參數(shù):
address_new?=?address_new.rename(columns={"index":"address","address":"number"}) address_newgroupby使用
groupby主要是實(shí)現(xiàn)分組統(tǒng)計(jì)的功能:
1、比如我們想統(tǒng)計(jì)男女各自的總分
#?統(tǒng)計(jì)男女的總成績(jī):sumsex_score?=?df1.groupby("sex")["score"].sum() sex_score2、求男女各自的平均分mean
#?統(tǒng)計(jì)男女的平均成績(jī):meansex_score?=?df1.groupby("sex")["score"].mean() sex_score3、根據(jù)男女性別sex、班級(jí)class求總分
#?先根據(jù)性別、班級(jí)求總分sex_class?=?df1.groupby(["sex","class"])["score"].sum() sex_class一行代碼實(shí)現(xiàn)上面的功能:
#?一行代碼實(shí)現(xiàn)df1.groupby(["sex","class"])["score"].sum().reset_index()apply函數(shù)
還是上面的df1數(shù)據(jù)集:
1、需求1:我們想將性別中的男變成1,女變成0
# 1、改變:男-1,女-0df2?=?df1.copy()??#?生成一個(gè)副本df2["sex"]?=?df2["sex"].apply(lambda?x:?1?if?x=="男"?else?0)??#?通過(guò)匿名函數(shù)解決 df2我們還可以自定義一個(gè)函數(shù)來(lái)實(shí)現(xiàn):
#??自定義函數(shù)def?apply_sex(x):return?1?if?x?==?"男"?else?0df3?=?df1.copy()??#?生成一個(gè)副本df3df3["sex"]?=?df3["sex"].apply(apply_sex)??#?通過(guò)自定義函數(shù)解決 df32、還比如我們想給每個(gè)城市的后面加上一個(gè)“市”,變成北京市、深圳市等:
# 2、給每個(gè)城市加上一個(gè)字:市,變成北京市、深圳市等df4?=?df1.copy()df4["address"]?=?df4["address"].apply(lambda?x:?x?+?"市") df4總結(jié)
本文中從pandas中DataFrame數(shù)據(jù)的創(chuàng)建,常見(jiàn)數(shù)據(jù)信息的探索,再到如何從數(shù)據(jù)框中獲取到我們指定的數(shù)據(jù),最后介紹了筆者常用的處理數(shù)據(jù)的方法,希望對(duì)入門或者對(duì)不熟悉pandas的朋友有所幫助。Pandas真的是十分強(qiáng)大,學(xué)好之后會(huì)大大節(jié)省我們處理數(shù)據(jù)的時(shí)間。
作者簡(jiǎn)介
Peter,碩士畢業(yè)僧一枚,從電子專業(yè)自學(xué)Python入門數(shù)據(jù)行業(yè),擅長(zhǎng)數(shù)據(jù)分析及可視化。個(gè)人站點(diǎn):www.renpeter.cn
推薦閱讀
Pandas處理數(shù)據(jù)太慢,來(lái)試試Polars吧!
懶人必備!只需一行代碼,就能導(dǎo)入所有的Python庫(kù)
絕!關(guān)于pip的15個(gè)使用小技巧
介紹10個(gè)常用的Python內(nèi)置函數(shù),99.99%的人都在用!
可能是全網(wǎng)最完整的 Python 操作 Excel庫(kù)總結(jié)!
總結(jié)
以上是生活随笔為你收集整理的入门Pandas不可不知的技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 嘘,Python 优化提速的 8 个小技
- 下一篇: Pandas直接读取arff格式的文件,