本文是【統(tǒng)計師的Python日記】第5天的日記 回顧一下: 第1天學(xué)習(xí)了Python的基本頁面、操作,以及幾種主要的容器類型; 第2天學(xué)習(xí)了python的函數(shù)、循環(huán)和條件、類。 第3天了解了Numpy這個工具庫。 第4天初步了解了Pandas這個庫 原文復(fù)習(xí)(點擊查看): 今天將帶來第5天的學(xué)習(xí)日記。 目錄如下: 前言 一、描述性統(tǒng)計 1. 加總 2. 描述性統(tǒng)計 3. 相關(guān)系數(shù) 二、缺失值處理 1. 丟棄缺失值 2. 填充缺失值 三、層次化索引 1. 用層次索引選取子集 2. 自定義變量名 3. 變量名與索引互換 4. 數(shù)據(jù)透視表 四、數(shù)據(jù)導(dǎo)入導(dǎo)出 1. 數(shù)據(jù)導(dǎo)入 2. 數(shù)據(jù)導(dǎo)出 統(tǒng)計師的Python日記【第5天:Pandas,露兩手】 前言 根據(jù)我的Python學(xué)習(xí)計劃:
上一集開始學(xué)習(xí)了Pandas的數(shù)據(jù)結(jié)構(gòu)(Series和DataFrame),以及DataFrame一些基本操作:改變索引名、增加一列、刪除一列、排序。 今天我將繼續(xù)學(xué)習(xí)Pandas。 一、描述性統(tǒng)計 想拿一個簡單的數(shù)據(jù)試試手,翻到了一份我國2012-2015年季度GDP的數(shù)據(jù),如下表(單位:萬億), 想整理到DataFrame中,如何處理? 用DataFrame:
得到了一張非常清爽的DataFrame數(shù)據(jù)表。 現(xiàn)在我要對這張表進(jìn)行簡單的描述性統(tǒng)計: 1. 加總 .sum()是將數(shù)據(jù)縱向加總(每一列加總) 這就很奇怪了,2012、2013、2014、2015四個年份的第一季度加總,這是什么鬼?其實我更想看橫向加總,就是每一年四個季度加總,得到一年的總和,原來,指定axis=1即可: 特別注意的是缺失值的情況! 如果有缺失值,比如四個數(shù)值2,3,1,NaN,那么加總的結(jié)果是2+3+1+NaN=6,也就是缺失值自動排除掉了!這點特別注意,因為這可能會導(dǎo)致你的數(shù)據(jù)不必苛,比如某一年少一個季度的值,那么這一年其實就是三個季度的加總,跟其他年份四個季度怎么比? 因為剛?cè)胄械臅r候在excel上犯過這類錯誤,所以在此記錄一下。 解決辦法是指定 skipna=False,有缺失值將不可加總:
這是一組有缺失值的數(shù)據(jù),現(xiàn)在來加總: 還可以累積加總: 關(guān)于缺失值,在后面還要專門學(xué)習(xí)(二、缺失值)。 2. 描述性統(tǒng)計 pandas除了加總,還可以利用 .describe() 得到每列的各種描述性分析: 當(dāng)然,除了用 .describe() 還可以自己用函數(shù)來得到,比如: 一些函數(shù)記錄在此(參考書本《利用Python進(jìn)行數(shù)據(jù)分析》):
3. 相關(guān)系數(shù) 利用 .corr() 可以計算相關(guān)系數(shù),比如計算四個季度的相關(guān)系數(shù): 計算年份的相關(guān)系數(shù)呢?轉(zhuǎn)置一下就可以了: 然而可惜的是——沒有P值! 也可以單獨只計算兩列的系數(shù),比如計算S1與S3的相關(guān)系數(shù): 二、缺失值處理 Pandas和Numpy采用NaN來表示缺失數(shù)據(jù), 1. 丟棄缺失值 兩種方法可以丟棄缺失值,比如第四天的日記中使用的的城市人口數(shù)據(jù): 將帶有缺失的行丟棄掉: 這個邏輯是:“一行中只要有一個格缺失,這行就要丟棄?!?/p> 那如果想要一行中全部缺失才丟棄,應(yīng)該怎么辦?傳入 how=’all‘ 即可。 Chu那行被丟棄掉了。 另一種丟棄缺失值的方法是 data[data.notnull()] ,但是只能處理 數(shù)值型 數(shù)據(jù)。 2. 填充缺失值 用 .fillna() 方法對缺失值進(jìn)行填充,比如將缺失值全部變?yōu)?: 還可以指定填充方法: method=
舉個例子: 后面baoding的pop被填充進(jìn)來了。 三、層次化索引 我們前面的索引就是Chu、Bao、Ha、Hu......,單一層次索引,如果索引為亞洲-中國-各個省-各個市,變量為人口,這就是典型的層次化索引。
這個例子中索引有兩層,國家和年份,來學(xué)習(xí)一些簡單的操作。 1. 用層次索引選取子集: 選取多個子集呢? 2. 自定義變量名 自定義變量名的好處很多,可以更方便的對數(shù)據(jù)進(jìn)行選擇。使用 columns= 自定義變量名: 索引的名字也可以當(dāng)變量一樣命名,分別命名country和year兩個索引名: 用 .swaplevel() 可以調(diào)換兩個索引contry和year的位置: 3. 將索引與變量互換 使用 .reset_index([]) 可以將索引變成列變量。 使用 .set_index([]),也可以講變量變成索引: 4. 數(shù)據(jù)透視表 大家都用過excel的數(shù)據(jù)透視表,把行標(biāo)簽和列標(biāo)簽隨意的布局,pandas也可以這么實施,使用 .unstack() 即可: 四、數(shù)據(jù)的導(dǎo)入導(dǎo)出 1. 數(shù)據(jù)導(dǎo)入 表格型數(shù)據(jù)可以直接讀取為DataFrame,比如用 read_csv 直接讀取csv文件: 有文件testSet.csv: 存在D盤下面,現(xiàn)在讀?。?/p> 發(fā)現(xiàn)了一個問題——第一行被當(dāng)做變量名了!所以要指定 header=None: 變量名變成了0、1,還是變扭啊,我們來指定個變量吧: 用 names= 可以指定變量名。 看到var1那列,如果想用這列做索引,咋辦?好辦! 用 index_col= 即可指定索引。 除了read_csv,還有幾種讀取方式:
read_table可以讀取txt的文件,說到這里,想到一個問題——如果txt文件的分隔符很奇怪怎么辦? 比如—— 這個testSet.txt文件用“l(fā)oves”做分隔符! 隱隱覺得有人向我表白,但是有點惡心...... 在實際中,更可能是某種亂碼,解決這種特殊分隔符,用 sep= 即可。 忽略紅色背景的部分。 還有一種情況是開頭帶有注釋的: 使用 skiprows= 就可以指定要跳過的行: 從我多年統(tǒng)計師從業(yè)經(jīng)驗來看,學(xué)會了如何跳過行,也要學(xué)如何讀取某些行,使用 nrows=n 可以指定要讀取的前n行,以數(shù)據(jù) 為例: 2. 數(shù)據(jù)導(dǎo)出 導(dǎo)出csv文件使用 data.to_csv 命令: data.to_csv(outFile, index=True, encoding='gb2312') index=True 指定輸出索引,當(dāng)數(shù)據(jù)中有中文的時候用 encoding= 來解碼,否則會出現(xiàn)亂碼,一般 gb2312 即可,有些例外的情況用 gb18030 基本都能解決。 無私的把日記給大家分享,覺得我?guī)浺操澮幌掳?,越多人覺得我?guī)洠揖驮较牍_越多的日記給大家看。 因為我?guī)洶 1. 關(guān)于數(shù)據(jù)分析的提問或求助直接在微信后臺留言。 2. 轉(zhuǎn)載、投稿、免費發(fā)布招聘、合作,請加數(shù)說君個人微信AnselT,或Email:jiayounet@163.com。 數(shù)說工作室 數(shù)據(jù)分析師之家 | 金融 生物 零售 互聯(lián)網(wǎng) 微信ID:shushuojun 長按二維碼關(guān)注數(shù)說工作室 |
|