本文是【統(tǒng)計(jì)師的Python日記】第5天的日記
回顧一下:
第1天學(xué)習(xí)了Python的基本頁面、操作,以及幾種主要的容器類型;
第2天學(xué)習(xí)了python的函數(shù)、循環(huán)和條件、類。
第3天了解了Numpy這個(gè)工具庫。
第4天初步了解了Pandas這個(gè)庫
原文復(fù)習(xí)(點(diǎn)擊查看):
今天將帶來第5天的學(xué)習(xí)日記。
目錄如下:
前言
一、描述性統(tǒng)計(jì)
1. 加總
2. 描述性統(tǒng)計(jì)
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)計(jì)師的Python日記【第5天:Pandas,露兩手】
前言
根據(jù)我的Python學(xué)習(xí)計(jì)劃:
Numpy → Pandas → 掌握一些數(shù)據(jù)清洗、規(guī)整、合并等功能 → 掌握類似與SQL的聚合等數(shù)據(jù)管理功能 → 能夠用Python進(jìn)行統(tǒng)計(jì)建模、假設(shè)檢驗(yàn)等分析技能 → 能用Python打印出100元錢 → 能用Python幫我洗衣服、做飯 → 能用Python給我生小猴子......
上一集開始學(xué)習(xí)了Pandas的數(shù)據(jù)結(jié)構(gòu)(Series和DataFrame),以及DataFrame一些基本操作:改變索引名、增加一列、刪除一列、排序。
今天我將繼續(xù)學(xué)習(xí)Pandas。
一、描述性統(tǒng)計(jì)
想拿一個(gè)簡(jiǎn)單的數(shù)據(jù)試試手,翻到了一份我國2012-2015年季度GDP的數(shù)據(jù),如下表(單位:萬億),
想整理到DataFrame中,如何處理?
用DataFrame:
gdp=DataFrame([[11.61,13.08, 13.67, 15.05],[12.81, 14.30, 15.07, 16.62], [13.87, 15.52, 16.35, 17.87], [14.80, 16.62,17.36, 18.94]], index=['2012', '2013', '2014', '2015'], columns=['s1', 's2','s3', 's4'])
得到了一張非常清爽的DataFrame數(shù)據(jù)表。
現(xiàn)在我要對(duì)這張表進(jìn)行簡(jiǎn)單的描述性統(tǒng)計(jì):
1. 加總
.sum()是將數(shù)據(jù)縱向加總(每一列加總)
這就很奇怪了,2012、2013、2014、2015四個(gè)年份的第一季度加總,這是什么鬼?其實(shí)我更想看橫向加總,就是每一年四個(gè)季度加總,得到一年的總和,原來,指定axis=1即可:
特別注意的是缺失值的情況!
如果有缺失值,比如四個(gè)數(shù)值2,3,1,NaN,那么加總的結(jié)果是2+3+1+NaN=6,也就是缺失值自動(dòng)排除掉了!這點(diǎn)特別注意,因?yàn)檫@可能會(huì)導(dǎo)致你的數(shù)據(jù)不必苛,比如某一年少一個(gè)季度的值,那么這一年其實(shí)就是三個(gè)季度的加總,跟其他年份四個(gè)季度怎么比?
因?yàn)閯側(cè)胄械臅r(shí)候在excel上犯過這類錯(cuò)誤,所以在此記錄一下。
解決辦法是指定 skipna=False,有缺失值將不可加總:
>>>df=DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.75, -1.3]], index=['a', 'b', 'c', 'd'], columns=['one', 'two'])
>>>df
這是一組有缺失值的數(shù)據(jù),現(xiàn)在來加總:
還可以累積加總:
關(guān)于缺失值,在后面還要專門學(xué)習(xí)(二、缺失值)。
2. 描述性統(tǒng)計(jì)
pandas除了加總,還可以利用 .describe() 得到每列的各種描述性分析:
當(dāng)然,除了用 .describe() 還可以自己用函數(shù)來得到,比如:
一些函數(shù)記錄在此(參考書本《利用Python進(jìn)行數(shù)據(jù)分析》):
方法 | 描述 |
count() | 非NA值的數(shù)量 |
describe() | 各列的匯總統(tǒng)計(jì) |
min()、max() | 最小、最大值 |
argmin()、argmax() | 最小、最大值對(duì)應(yīng)的索引位置 |
idxmin()、idxmax() | 最小、最大值對(duì)應(yīng)的索引值 |
quantile() | 樣本分位數(shù) |
sum() | 加總 |
mean() | 均值 |
median() | 中位數(shù) |
mad() | 根據(jù)平均值計(jì)算的平均絕對(duì)離差 |
var() | 方差 |
std() | 標(biāo)準(zhǔn)差 |
skew() | 偏度 |
kurt() | 峰度 |
cumsum() | 累計(jì)和 |
cummax()、cummin() | 累計(jì)最大值和累計(jì)最小值 |
cumprod() | 累計(jì)積 |
diff() | 一階差分 |
pct_change() | 百分?jǐn)?shù)變化 |
3. 相關(guān)系數(shù)
利用 .corr() 可以計(jì)算相關(guān)系數(shù),比如計(jì)算四個(gè)季度的相關(guān)系數(shù):
計(jì)算年份的相關(guān)系數(shù)呢?轉(zhuǎn)置一下就可以了:
然而可惜的是——沒有P值!
也可以單獨(dú)只計(jì)算兩列的系數(shù),比如計(jì)算S1與S3的相關(guān)系數(shù):
二、缺失值處理
Pandas和Numpy采用NaN來表示缺失數(shù)據(jù),
1. 丟棄缺失值
兩種方法可以丟棄缺失值,比如第四天的日記中使用的的城市人口數(shù)據(jù):
將帶有缺失的行丟棄掉:
這個(gè)邏輯是:“一行中只要有一個(gè)格缺失,這行就要丟棄。”
那如果想要一行中全部缺失才丟棄,應(yīng)該怎么辦?傳入 how=’all‘ 即可。
Chu那行被丟棄掉了。
另一種丟棄缺失值的方法是 data[data.notnull()] ,但是只能處理 數(shù)值型 數(shù)據(jù)。
2. 填充缺失值
用 .fillna() 方法對(duì)缺失值進(jìn)行填充,比如將缺失值全部變?yōu)?:
還可以指定填充方法:
method=
'ffill' 向前填充,即將前面的內(nèi)容填充進(jìn)來;
'bffill' 向后填充,即將后面的內(nèi)容填充進(jìn)來。
舉個(gè)例子:
后面baoding的pop被填充進(jìn)來了。
三、層次化索引
我們前面的索引就是Chu、Bao、Ha、Hu......,單一層次索引,如果索引為亞洲-中國-各個(gè)省-各個(gè)市,變量為人口,這就是典型的層次化索引。
>>> worldPop = pd.Series([13.74,13.41, 13.08, 1.27, 3.21, 3.09],index=[['China','China','China','Japan','US','US'],[2015,2010,2005,2015,2015,2010]])
這個(gè)例子中索引有兩層,國家和年份,來學(xué)習(xí)一些簡(jiǎn)單的操作。
1. 用層次索引選取子集:
選取多個(gè)子集呢?
2. 自定義變量名
自定義變量名的好處很多,可以更方便的對(duì)數(shù)據(jù)進(jìn)行選擇。使用 columns= 自定義變量名:
索引的名字也可以當(dāng)變量一樣命名,分別命名country和year兩個(gè)索引名:
用 .swaplevel() 可以調(diào)換兩個(gè)索引contry和year的位置:
3. 將索引與變量互換
使用 .reset_index([]) 可以將索引變成列變量。
使用 .set_index([]),也可以講變量變成索引:
4. 數(shù)據(jù)透視表
大家都用過excel的數(shù)據(jù)透視表,把行標(biāo)簽和列標(biāo)簽隨意的布局,pandas也可以這么實(shí)施,使用 .unstack() 即可:
四、數(shù)據(jù)的導(dǎo)入導(dǎo)出
1. 數(shù)據(jù)導(dǎo)入
表格型數(shù)據(jù)可以直接讀取為DataFrame,比如用 read_csv 直接讀取csv文件:
有文件testSet.csv:
存在D盤下面,現(xiàn)在讀取:
發(fā)現(xiàn)了一個(gè)問題——第一行被當(dāng)做變量名了!所以要指定 header=None:
變量名變成了0、1,還是變扭啊,我們來指定個(gè)變量吧:
用 names= 可以指定變量名。
看到var1那列,如果想用這列做索引,咋辦?好辦!
用 index_col= 即可指定索引。
除了read_csv,還有幾種讀取方式:
函數(shù) | 說明 |
read_csv | 讀取帶分隔符的數(shù)據(jù),默認(rèn)分隔符為逗號(hào) |
read_table | 讀取帶分隔符的數(shù)據(jù),默認(rèn)分隔符為制表符 |
read_fwf | 讀取固定寬格式數(shù)據(jù)(無分隔符) |
read_clipboard | 讀取剪貼板中的數(shù)據(jù) |
read_table可以讀取txt的文件,說到這里,想到一個(gè)問題——如果txt文件的分隔符很奇怪怎么辦?
比如——
這個(gè)testSet.txt文件用“l(fā)oves”做分隔符!
隱隱覺得有人向我表白,但是有點(diǎn)惡心......
在實(shí)際中,更可能是某種亂碼,解決這種特殊分隔符,用 sep= 即可。
忽略紅色背景的部分。
還有一種情況是開頭帶有注釋的:
使用 skiprows= 就可以指定要跳過的行:
從我多年統(tǒng)計(jì)師從業(yè)經(jīng)驗(yàn)來看,學(xué)會(huì)了如何跳過行,也要學(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ù)中有中文的時(shí)候用 encoding= 來解碼,否則會(huì)出現(xiàn)亂碼,一般 gb2312 即可,有些例外的情況用 gb18030 基本都能解決。
無私的把日記給大家分享,覺得我?guī)浺操澮幌掳?,越多人覺得我?guī)?,我就越想公開越多的日記給大家看。
因?yàn)槲規(guī)洶
1. 關(guān)于數(shù)據(jù)分析的提問或求助直接在微信后臺(tái)留言。
2. 轉(zhuǎn)載、投稿、免費(fèi)發(fā)布招聘、合作,請(qǐng)加數(shù)說君個(gè)人微信AnselT,或Email:jiayounet@163.com。
數(shù)說工作室
數(shù)據(jù)分析師之家 | 金融 生物 零售 互聯(lián)網(wǎng)
微信ID:shushuojun
長按二維碼關(guān)注數(shù)說工作室
聯(lián)系客服