|
大家好,我是Python之眼。 今天來跟大家分享 Pandas 的一些常用知識點,文章內(nèi)容由公眾號讀者 Peter 創(chuàng)作。 如果你用 Python 做數(shù)據(jù)分析,必然會繞不過 Pandas 的使用,實際上, Python 也是由于 numpy、pandas 等數(shù)據(jù)科學(xué)庫的出現(xiàn),才開始在數(shù)據(jù)科學(xué)領(lǐng)域?qū)崿F(xiàn)了快速的發(fā)展,因此,學(xué)好 Pandas 有很重要的現(xiàn)實意義。 本文總結(jié)自己經(jīng)常使用的pandas操作方法:
首先,導(dǎo)入包 import pandas as pdimport numpy as np01 創(chuàng)建DataFrame數(shù)據(jù)方式1:通過字典直接創(chuàng)建數(shù)據(jù)如下圖: 方式2:通過本地數(shù)據(jù)讀取從本地文件中讀取進(jìn)來?,F(xiàn)在本地有一個文件:學(xué)生信息.xlsx直接通過pd.read_excel()讀進(jìn)來: df2 = pd.read_excel('學(xué)生信息.xlsx')df2可以看到效果和上面是一樣的 02 數(shù)據(jù)探索查看數(shù)據(jù)shapeshape表示數(shù)據(jù)是由多少行和列組成: 查看字段屬性名稱df1.columns查看屬性的數(shù)據(jù)類型可以看到只有兩種數(shù)據(jù)類型:int64和object 查看數(shù)據(jù)是否缺失df1.isnull() # 如果缺失顯示為True,否則顯示False結(jié)果顯示:本次數(shù)據(jù)是沒有缺失值的 查看數(shù)據(jù)行索引df1.index查看數(shù)據(jù)描述信息查看數(shù)據(jù)統(tǒng)計值統(tǒng)計值信息只會顯示類型為數(shù)值型的數(shù)據(jù)統(tǒng)計值信息: df1.describe()統(tǒng)計值的結(jié)果包含:個數(shù)count、均值mean、方差std、最值min\max、四分位數(shù)25%、中位數(shù)50%、四分之三分位數(shù)75%。 03 查看頭尾文件通過head和tail方法能夠快速查看數(shù)據(jù)的頭尾文件。 headtaildf1.tail() # 默認(rèn)尾部5行df1.tail(3) # 指定尾部3行數(shù)據(jù)04 花樣取數(shù)從pandas的DataFrame數(shù)據(jù)框中取出我們想要的數(shù)據(jù),然后進(jìn)行處理 取出某個字段的數(shù)據(jù)我們?nèi)〕鰊ame這列的數(shù)據(jù): 取出多個字段的數(shù)據(jù)比如我們?nèi)〕鰊ame和age列的數(shù)據(jù): name_age = df1[['name','age']] name_age# 結(jié)果 name age0 小明 201 小紅 182 小孫 273 王小 204 關(guān)宇 285 劉蓓 186 張菲 25根據(jù)字段類型選擇數(shù)據(jù)比如,我們想選擇字段類型為int64的數(shù)據(jù),通過查看的字段數(shù)據(jù)類型顯示:age和score都是int64類型 1、選擇單個數(shù)據(jù)類型2、同時選擇多個類型df1.select_dtypes(include=['int64','object'])# 結(jié)果 name age sex score address0 小明 20 男 669 北京1 小紅 18 女 570 深圳2 小孫 27 男 642 廣州3 王小 20 男 590 武漢4 關(guān)宇 28 男 601 深圳5 劉蓓 18 女 619 廣州6 張菲 25 女 701 長沙因為數(shù)據(jù)中只有int64,object,所以我們?nèi)窟x出來了。 3、選擇排除某些數(shù)據(jù)類型之外的數(shù)據(jù):根據(jù)數(shù)值大小取數(shù)1、直接通過判斷大小來取數(shù):df1[df1['age'] == 20] # 年齡等于20df1[df1['age'] != 20] # 年齡不等于20df1[df1['age'] >= 20] # 年齡大于等于202、多個判斷條件連用第一次使用上面的方法報錯:關(guān)鍵詞是ambiguous。判斷條件很讓pandas混淆,改成下面的寫法成功解決: ![]() 根據(jù)字符串取數(shù)1、通過單個條件取數(shù)# 1、單條數(shù)據(jù)df1[df1['name'] == '小明'] # 結(jié)果 name age sex score address0 小明 20 男 669 北京2、通過多個條件取數(shù)選擇姓名是小明,或者年齡大于25的數(shù)據(jù) 3、字符串的開始、結(jié)尾、包含函數(shù)
# 1、取出以“小”開頭的姓名df1[df1['name'].str.startswith('小')] # name以'小'開頭# 結(jié)果 name age sex score address0 小明 20 男 669 北京1 小紅 18 女 570 深圳2 小孫 27 男 642 廣州# 3、以“菲”結(jié)尾df1[df1['name'].str.endswith('菲')]# 結(jié)果 name age sex score address6 張菲 25 女 701 長沙上面的王小不是小開頭,但是包含小,所以也被選出來。 4、字符串取反操作取反符號是波浪線:~ 下面的例子是:取出名字name中不包含小的數(shù)據(jù),只有3個人名字中沒有小字。 # 取出不包含小的數(shù)據(jù)df1[~df1['name'].str.contains('小')]# 結(jié)果 name age sex score address4 關(guān)宇 28 男 601 深圳5 劉蓓 18 女 619 廣州6 張菲 25 女 701 長沙05 切片取數(shù)切片是Python中存在的概念,在pandas中同樣可以使用。切片中存在3個概念:start、stop、step
寫法為:[start:stop:step] 如果大家在學(xué)習(xí)中遇到困難,想找一個python學(xué)習(xí)交流環(huán)境,可以加入我們一起學(xué)習(xí),關(guān)注小編,并私信“01”即可領(lǐng)取python學(xué)習(xí)資料,會節(jié)約很多時間,減少很多遇到的難題。 步長為正數(shù)1、通過下面的3個案例說明:起始索引默認(rèn)從0開始,步長默認(rèn)是1 ![]() ![]() 2、指定起始索引,不指定結(jié)束索引,表示一直取到數(shù)據(jù)末尾 3、改變步長的值 df1[0:4:2] # 改變步長:每隔2個值取一行數(shù)據(jù)# 結(jié)果 name age sex score address0 小明 20 男 669 北京2 小孫 27 男 642 廣州上面的例子不指定起始索引: 4、只指定步長 df1[::2] # 從頭到尾,步長為2# 結(jié)果 name age sex score address0 小明 20 男 669 北京2 小孫 27 男 642 廣州4 關(guān)宇 28 男 601 深圳6 張菲 25 女 701 長沙步長為負(fù)數(shù)1、步長為-1,默認(rèn)是倒序輸出結(jié)果 2、步長為負(fù),指定起始和終止索引,起始索引大于終止索引 df1[4:0:-1] name age sex score address4 關(guān)宇 28 男 601 深圳3 王小 20 男 590 武漢2 小孫 27 男 642 廣州1 小紅 18 女 570 深圳3、起始和終止索引為負(fù)數(shù) 06 常用函數(shù)統(tǒng)計元素個數(shù)很多時候我們需要統(tǒng)計某個列中每個元素出現(xiàn)的個數(shù),相當(dāng)于是做詞頻統(tǒng)計,使用:value_counts()方法,具體案例為: ??:新數(shù)據(jù)中df1增加了一列:班級class,后續(xù)有作用 ![]() 比如我們想統(tǒng)計每個城市出現(xiàn)了多少次: # 統(tǒng)計中每個城市各出現(xiàn)了多少次address = df1['address'].value_counts()address![]() 結(jié)果自動是降序排列的Series類型數(shù)據(jù) 索引重置索引重置使用reset_index(): ![]() 還比如我們想從數(shù)據(jù)中單獨取出sex='男'的數(shù)據(jù): fale = df1[df1['sex'] == '男']fale![]() 我們觀察到數(shù)據(jù)前面的索引還是原來的,但是我們希望的是從0開始顯示,比較符合我們的習(xí)慣: ![]() 出現(xiàn)的結(jié)果中索引是我們想要的結(jié)果,但是出現(xiàn)了一列新的數(shù)據(jù),就是原來的索引構(gòu)成的數(shù)據(jù),這不是我們想要的數(shù)據(jù),需要去除: fale_1 = fale.reset_index(drop=True) # 加上參數(shù)即可解決fale_1![]() 屬性重命名使用的是rename函數(shù),傳入columsn參數(shù): ![]() groupby使用groupby主要是實現(xiàn)分組統(tǒng)計的功能: 1、比如我們想統(tǒng)計男女各自的總分 ![]() # 統(tǒng)計男女的總成績:sumsex_score = df1.groupby('sex')['score'].sum()sex_score![]() 2、求男女各自的平均分mean ![]() 3、根據(jù)男女性別sex、班級class求總分 # 先根據(jù)性別、班級求總分sex_class = df1.groupby(['sex','class'])['score'].sum()sex_class![]() 一行代碼實現(xiàn)上面的功能: ![]() apply函數(shù)還是上面的df1數(shù)據(jù)集: ![]() 1、需求1:我們想將性別中的男變成1,女變成0 # 1、改變:男-1,女-0df2 = df1.copy() # 生成一個副本df2['sex'] = df2['sex'].apply(lambda x: 1 if x=='男' else 0) # 通過匿名函數(shù)解決df2![]() 我們還可以自定義一個函數(shù)來實現(xiàn): ![]() 2、還比如我們想給每個城市的后面加上一個“市”,變成北京市、深圳市等: # 2、給每個城市加上一個字:市,變成北京市、深圳市等df4 = df1.copy()df4['address'] = df4['address'].apply(lambda x: x + '市')df4![]() 總結(jié)本文中從pandas中DataFrame數(shù)據(jù)的創(chuàng)建,常見數(shù)據(jù)信息的探索,再到如何從數(shù)據(jù)框中獲取到我們指定的數(shù)據(jù),最后介紹了筆者常用的處理數(shù)據(jù)的方法,希望對入門或者對不熟悉pandas的朋友有所幫助。Pandas真的是十分強(qiáng)大,學(xué)好之后會大大節(jié)省我們處理數(shù)據(jù)的時間。 最后多說一句,小編是一名python開發(fā)工程師,這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程,包括從基礎(chǔ)的python腳本到web開發(fā)、爬蟲、數(shù)據(jù)分析、數(shù)據(jù)可視化、機(jī)器學(xué)習(xí)等。想要這些資料的可以關(guān)注小編,并在后臺私信小編:“01”即可領(lǐng)取。 |
|
|