摘要:數(shù)據(jù)規(guī)整化清理轉(zhuǎn)換合并重塑數(shù)據(jù)聚合與分組運(yùn)算數(shù)據(jù)規(guī)整化清理轉(zhuǎn)換合并重塑合并數(shù)據(jù)集可根據(jù)一個(gè)或多個(gè)鍵將不同中的行鏈接起來。函數(shù)根據(jù)樣本分位數(shù)對(duì)數(shù)據(jù)進(jìn)行面元?jiǎng)澐帧W值浠?,給出待分組軸上的值與分組名之間的對(duì)應(yīng)關(guān)系。
本篇內(nèi)容為整理《利用Python進(jìn)行數(shù)據(jù)分析》,博主使用代碼為 Python3,部分內(nèi)容和書本有出入。
在前幾篇中我們介紹了 NumPy、pandas、matplotlib 三個(gè)庫(kù)的基本操作,本篇介紹對(duì)數(shù)據(jù)的一些操作。
數(shù)據(jù)規(guī)整化:清理、轉(zhuǎn)換、合并、重塑
數(shù)據(jù)聚合與分組運(yùn)算
pandas.merge:可根據(jù)一個(gè)或多個(gè)鍵將不同DataFrame中的行鏈接起來。
pandas.concat:可沿著一條軸將多個(gè)對(duì)象堆疊到一起。
combine_first:可將重復(fù)數(shù)據(jù)編接在一起,用一個(gè)對(duì)象中的值填充另一個(gè)對(duì)象中的缺失值。
數(shù)據(jù)庫(kù)風(fēng)格的 DataFrame 合并
數(shù)據(jù)集的合并或連接運(yùn)算:通過一個(gè)或多個(gè)鍵將行鏈接起來。
多對(duì)一的合并:
若沒有指定用哪個(gè)列進(jìn)行連接,merge會(huì)將重疊列名當(dāng)做鍵,指定如下:
若兩個(gè)對(duì)象的列名不同,可分別進(jìn)行指定:
默認(rèn)情況下,merge做inner連接,結(jié)果中的鍵是交集。外連接求取的是鍵的并集:
多對(duì)多的合并操作:
連接方式只影響出現(xiàn)在結(jié)果中的鍵。
根據(jù)多個(gè)鍵進(jìn)行合并,傳入一個(gè)由列名組成的列表:
在進(jìn)行列-列連接時(shí),DataFrame對(duì)象中的索引會(huì)被丟棄。
suffixes選項(xiàng):指定附加到左右兩個(gè)DataFrame對(duì)象的重疊列名上的字符串。
索引上的合并
當(dāng)DataFrame中的連接鍵位于其索引中時(shí),傳入left_index=True、 right_index=True,以說明索引應(yīng)該被用作連接鍵:
對(duì)于層次化索引的數(shù)據(jù):
必須以列表的形式指明用作合并鍵的列(注意對(duì)重復(fù)索引值的處理):
使用合并雙方的索引:
DataFrame的 join 實(shí)例方法:
更方便的實(shí)現(xiàn)按索引合并,不管有沒有重疊的列。在連接鍵上作左連接。
支持參數(shù)DataFrame的索引跟調(diào)用者DataFrame的某個(gè)列之間的連接:
對(duì)于簡(jiǎn)單的索引合并,可以向join傳入一組DataFrame(concat 函數(shù)也是這個(gè)功能):
軸向連接
數(shù)據(jù)合并運(yùn)算:
連接(concatenation)
綁定(binding)
堆疊(stacking)
NumPy有一個(gè)用于合并原始NumPy數(shù)組的concatenation函數(shù):
pandas的concat函數(shù):
默認(rèn)情況下,concat在 axis=0 上工作,產(chǎn)生一個(gè)新Series。傳入 axis=1,產(chǎn)生一個(gè)DataFrame:
這種情況下,另外一條軸上沒有重疊,傳入 join = "inner" 得到它們的交集:
使用 key 參數(shù),在連接軸上創(chuàng)建一個(gè)層次化索引:
沿著 axis=1 對(duì)Series進(jìn)行合并,keys 就會(huì)成為DataFrame的列頭:
對(duì)DataFrame對(duì)象也是如此:
傳入一個(gè)字典,則字典的鍵會(huì)被當(dāng)做keys選項(xiàng)的值:
用于管理層次化索引創(chuàng)建方式的參數(shù):
跟當(dāng)前分析工作無關(guān)的DataFrame行索引:
傳入 ignore_index = True:
合并重疊數(shù)據(jù)
關(guān)于有索引全部或部分重疊的兩個(gè)數(shù)據(jù)集。
NumPy的where函數(shù),用于表達(dá)一種矢量化的if-else:
Series的combine_first方法,實(shí)現(xiàn)與上面一樣的功能,并會(huì)進(jìn)行數(shù)據(jù)對(duì)齊:
對(duì)于DataFrame 一樣:
可以看作用參數(shù)對(duì)象中的數(shù)據(jù)為調(diào)用者對(duì)象的缺失數(shù)據(jù)“打補(bǔ)丁”。
用于重新排列表格型數(shù)據(jù)的基礎(chǔ)運(yùn)算:重塑(reshape)或軸向旋轉(zhuǎn)(pivot)。
重塑層次化索引
stark:將數(shù)據(jù)的列“旋轉(zhuǎn)”為行
unstark:將數(shù)據(jù)的行“旋轉(zhuǎn)”為列
用stack方法將行轉(zhuǎn)為列,得到一個(gè)Series:
對(duì)層次化索引的Series,可以用unstack將其重新排為一個(gè)DataFrame:
默認(rèn)情況下,unstack操作最內(nèi)層。
傳入分層級(jí)別的編號(hào)或名稱可對(duì)其他級(jí)別進(jìn)行unstack操作:
如果不是所有的級(jí)別值都能在各分組找到的話,unstack操作可能會(huì)引入缺失數(shù)據(jù):
stack默認(rèn)會(huì)濾除缺失數(shù)據(jù),因此該運(yùn)算是可逆的:
對(duì)DataFrame進(jìn)行unstack操作時(shí),作為旋轉(zhuǎn)軸的級(jí)別將會(huì)成為結(jié)果中的最低級(jí)別:
將“長(zhǎng)格式”旋轉(zhuǎn)為“寬格式”
時(shí)間序列數(shù)據(jù)通常以 “長(zhǎng)格式(long)”或“堆疊格式(stacked)”存儲(chǔ)在數(shù)據(jù)庫(kù)和 CSV 中。
轉(zhuǎn)成DataFrame,用 pivot 方法:
得到的DataFrame帶有層次化的列:
假設(shè)有兩個(gè)需要參與重塑的數(shù)據(jù)列:
pivot其實(shí)只是一個(gè)快捷方式:用set_index創(chuàng)建層次化索引,再用unstack重塑。
以上是數(shù)據(jù)的重排,下面是過濾、清理及其他轉(zhuǎn)換工作。
數(shù)據(jù)轉(zhuǎn)換移除重復(fù)數(shù)據(jù)
DataFrame中出現(xiàn)的重復(fù)行:
DataFrame的duplicated方法返回一個(gè)布爾型Series,表示各行是否是重復(fù)行,drop_duplicates方法返回一個(gè)移除了重復(fù)行的DataFrame:
指定部分列進(jìn)行重復(fù)項(xiàng)判斷,如只希望根據(jù)k1列過濾重復(fù)項(xiàng):
duplicated和drop_duplicates默認(rèn)保留重復(fù)數(shù)值里第一次出現(xiàn)的組合,傳入keep = last則保留最后一個(gè):
利用函數(shù)或映射進(jìn)行數(shù)據(jù)轉(zhuǎn)換
根據(jù)數(shù)組、Series或DataFrame列中的值來實(shí)現(xiàn)轉(zhuǎn)換。
編寫一個(gè)肉類到動(dòng)物的映射:
Series的map方法:可以接受一個(gè)函數(shù)或含有映射關(guān)系的字典型對(duì)象,用于修改對(duì)象的數(shù)據(jù)子集。
也可以傳入一個(gè)能夠完成全部這些工作的函數(shù):
替換值
replace方法 :替換
利用fillna方法填充缺失數(shù)據(jù)可以看作替換的一種特殊情況。
替換一個(gè)值和一次性替換多個(gè)值:
對(duì)不同的值進(jìn)行不同的替換:
傳入的參數(shù)也可以是字典:
重命名軸索引
軸標(biāo)簽有一個(gè)map方法:
對(duì)函數(shù)或映射進(jìn)行轉(zhuǎn)換,從而得到一個(gè)新對(duì)象。
將其值賦給index,就可以對(duì)DataFrame進(jìn)行就地修改了:
要?jiǎng)?chuàng)建數(shù)據(jù)集的轉(zhuǎn)換版,而不是修改原始數(shù)據(jù),用rename:
rename結(jié)合字典型對(duì)象可以實(shí)現(xiàn)對(duì)部分軸標(biāo)簽的更新:
rename實(shí)現(xiàn)了復(fù)制DataFrame并對(duì)其索引和列標(biāo)簽進(jìn)行賦值,就地修改某個(gè)數(shù)據(jù)集,傳入inplace=True:
離散化和面元?jiǎng)澐?/strong>
為了便于分析,連續(xù)數(shù)據(jù)常常被離散化或拆分為“面元(bin)”。
用pandas的cut函數(shù):
pandas返回的是一個(gè)特殊的Categorical對(duì)象,它含有一個(gè)表示不同分類名稱的數(shù)組和一個(gè)為年齡數(shù)據(jù)進(jìn)行標(biāo)號(hào)的屬性:
哪邊是閉端可以通過right=False進(jìn)行修改:
設(shè)置自己的面元名稱:
將labels選項(xiàng)設(shè)置為一個(gè)列表或數(shù)組即可。
如果向cut傳入的是面元的數(shù)量而不是確切的面元邊界,則它會(huì)根據(jù)數(shù)據(jù)的最小值和最大值計(jì)算等長(zhǎng)面元:
將一些均勻分布的數(shù)據(jù)分成了四組。
qcut函數(shù):根據(jù)樣本分位數(shù)對(duì)數(shù)據(jù)進(jìn)行面元?jiǎng)澐帧?/p>
由于qcut使用的是樣本分位數(shù),可以得到大小基本相等的面元(而 cut 根據(jù)數(shù)據(jù)的分布情況,可能無法使各個(gè)面元中含有相同數(shù)量的數(shù)據(jù)點(diǎn))。
設(shè)置自定義的分位數(shù):
在聚合和分組運(yùn)算時(shí)會(huì)再次用到cut 和 qcut 這兩個(gè)離散化函數(shù)。
檢測(cè)和過濾異常值
判斷是否存在異常值(outlier ):
找出某列中絕對(duì)值大小超過 3 的值:
選出全部含有“超過 3 或 -3 的值”的行:
將值限制在區(qū)間 -3 到 3 以內(nèi):
np.sign這個(gè)ufunc返回的是一個(gè)由 1 和 -1 組成的數(shù)組,表示原始值的符號(hào)。
排列和隨機(jī)采樣
numpy.random.permutation函數(shù):對(duì)Series和DataFrame的列排列。
Permutation(5):需要排列的軸的長(zhǎng)度。
然后就可以在基于ix的索引操作或take函數(shù)中使用該數(shù)組了:
選取隨機(jī)子集(非替換):
用替換的方式產(chǎn)生樣本:
計(jì)算指標(biāo)/啞變量
將分類變量(Categorical)轉(zhuǎn)換為“啞變量矩陣(dummy matrix)”或“指標(biāo)矩陣(indicator matrix)”。
給DataFrame的列加上一個(gè)前綴,以便能夠跟其他數(shù)據(jù)進(jìn)行合并:
用get_dummies的prefix參數(shù)。
DataFrame中的某行同屬于多個(gè)分類的情況,舉個(gè)例子:
要為每個(gè)genre添加指標(biāo)變量就需要做一些數(shù)據(jù)規(guī)整操作,構(gòu)建多成員指標(biāo)變量:
對(duì)于很大的數(shù)據(jù),這種方式會(huì)變得非常慢,需要編寫一個(gè)能夠利用DataFrame內(nèi)部機(jī)制的更低級(jí)的函數(shù):
用get_dummies和cut之類的離散化函數(shù)。
字符串對(duì)象方法
Python 字符串對(duì)象的內(nèi)置方法:
find找不到返回 -1,index找不到引發(fā)一個(gè)異常
傳入空字符串常常用于刪除模式:
正則表達(dá)式(regex)
提供了一種靈活的在文本中搜索或匹配字符串模式的方式。python 內(nèi)置的re模塊負(fù)責(zé)對(duì)字符串應(yīng)用正則表達(dá)式。
re模塊的函數(shù)分為三個(gè)大類:模式匹配、替換、拆分。
描述一個(gè)或多個(gè)空白符的regex是 s+。
調(diào)用re.split("s+", text)時(shí),正則表達(dá)式會(huì)先被編譯,然后再在text上調(diào)用其split方法。
可以用re.compile自己編譯一個(gè)regex,以得到一個(gè)可重用的regex對(duì)象,如上所示。如果打算對(duì)許多字符串應(yīng)用同一條正則表達(dá)式,強(qiáng)烈建議通過這種方法,可以節(jié)省大量的 CPU 時(shí)間。
得到匹配regex的所有模式:
findall:返回字符串中所有的匹配項(xiàng)。
search:只返回第一個(gè)匹配項(xiàng)。
match:只匹配字符串的首部。
sub方法:將匹配到的模式替換為指定字符串,并返回所得到的新字符串。
不僅想找出電子郵件地址,還想將各個(gè)地址分為 3 個(gè)部分,只需將待分段的模式的各部分用圓括號(hào)包起來:
通過groups方法返回一個(gè)由模式各段組成的元組。
對(duì)于帶有分組功能的模式,findall會(huì)返回一個(gè)元組列表:
sub還能通過諸如1, 2之類的特殊符號(hào)訪問各匹配項(xiàng)中的分組:
為各個(gè)匹配分組加上一個(gè)名稱,由這種正則表達(dá)式所產(chǎn)生的匹配對(duì)象可以得到一個(gè)簡(jiǎn)單易用的帶有分組名稱的字典:
pandas 中矢量化的字符串函數(shù)
通過data.map,所有字符串和正則表達(dá)式方法都能被應(yīng)用于各個(gè)值,但如存在NA就會(huì)報(bào)錯(cuò),為了解決這個(gè)問題,Series有一些能夠跳過NA值的字符串操作方法,通過Series的str屬性即可訪問這些方法:
也可以用正則表達(dá)式:
實(shí)現(xiàn)矢量化的元素獲取操作,對(duì)str.get/str屬性上使用索引:
對(duì)字符串進(jìn)行子串截?。?/p>
對(duì)數(shù)據(jù)集進(jìn)行分組并對(duì)各組應(yīng)用一個(gè)函數(shù)。
在將數(shù)據(jù)集準(zhǔn)備好之后,通常的任務(wù)就是計(jì)算分組統(tǒng)計(jì)或生成透視表。pandas提供了一個(gè)靈活高效的gruopby功能,對(duì)數(shù)據(jù)集進(jìn)行切片、切塊、摘要等操作。
用 python 和pandas強(qiáng)大的表達(dá)能力可以執(zhí)行復(fù)雜的多的分組運(yùn)算:利用任何可以接受pandas對(duì)象或NumPy數(shù)組的函數(shù)。
分組運(yùn)算:split(拆分)--apply(應(yīng)用)--combine(合并)。
分組鍵的形式:
列表或數(shù)組,其長(zhǎng)度與待分組的軸一樣。
表示DataFrame某個(gè)列名的值。
字典或Series,給出待分組軸上的值與分組名之間的對(duì)應(yīng)關(guān)系。
函數(shù),用于處理軸索引或索引中的各個(gè)標(biāo)簽。
訪問data1,并根據(jù)key1調(diào)用groupby。
變量grouped是一個(gè)GroupBy對(duì)象,它實(shí)際上還沒有進(jìn)行任何計(jì)算,只是含有一些有關(guān)分組鍵df["key1"]的中間數(shù)據(jù)。
例如,調(diào)用GroupBy的mean方法來計(jì)算分組平均值:
Series根據(jù)分組鍵進(jìn)行了聚合,產(chǎn)生了一個(gè)新的Series,其索引為key1列中的唯一值。
通過兩個(gè)鍵對(duì)數(shù)據(jù)進(jìn)行了分組后,得到的Series具有一個(gè)層次化索引:
分組鍵可以是任何長(zhǎng)度適當(dāng)?shù)臄?shù)組:
將列名用作分組鍵:
GroupBy的size方法返回一個(gè)含有分組大小的Series:
對(duì)分組進(jìn)行迭代
GroupBy對(duì)象支持迭代,可以產(chǎn)生一組二元元組(由分組名和數(shù)據(jù)塊組成)。
對(duì)于多重鍵,元組的第一個(gè)元素將會(huì)是由鍵值組成的元組。
對(duì)數(shù)據(jù)片段進(jìn)行操作,如將這些數(shù)據(jù)片段做成一個(gè)字典:
groupby默認(rèn)在axis=0上進(jìn)行分組,通過設(shè)置可以在其它任何軸上進(jìn)行分組,如可以根據(jù)dtype對(duì)列進(jìn)行分組:
選取一個(gè)或一組列
對(duì)于由DataFrame產(chǎn)生的GroupBy對(duì)象,用一個(gè)或一組(單個(gè)字符串或字符串?dāng)?shù)組)列名對(duì)其進(jìn)行索引,就能實(shí)現(xiàn)選取部分列進(jìn)行聚合的目的:
例如,對(duì)部分列進(jìn)行聚合:計(jì)算data2列的平均值并以DataFrame形式得到結(jié)果:
返回一個(gè)已分組的DataFrame(傳入的是列表或數(shù)組)或Series(傳入的是標(biāo)量形式的單個(gè)列名):
通過字典或 Series 進(jìn)行分組
除數(shù)組以外,分組信息還可以其他形式存在
根據(jù)分組計(jì)算列的sum:
將mapping這個(gè)字典傳給groupby即可。
用Series作為分組鍵:
這里Series可以被看做一個(gè)固定大小的映射。pandas會(huì)檢查Series以確保其索引根分組軸是對(duì)齊的。
通過函數(shù)進(jìn)行分組
任何被當(dāng)做分組鍵的函數(shù)都會(huì)在各個(gè)索引值上被調(diào)用一次,其返回值就會(huì)被用作分組名稱。
將函數(shù)根數(shù)組、列表、字典、Series混合使用(任何東西最終都會(huì)被轉(zhuǎn)換為數(shù)組):
Key_list和人名對(duì)應(yīng),再在相同長(zhǎng)度的對(duì)應(yīng)一列里選min的值。
根據(jù)索引級(jí)別分組
層次化索引數(shù)據(jù)集通過level關(guān)鍵字傳入級(jí)別編號(hào)或名稱:
可以使用經(jīng)過優(yōu)化的GroupBy的方法,還可以使用自己發(fā)明的聚合運(yùn)算,還可以調(diào)用分組對(duì)象上已經(jīng)定義好的任何方法,如 quantile可以計(jì)算Series或DataFrame列的樣本分位數(shù):
GroupBy會(huì)高效地對(duì)Series進(jìn)行切片,然后對(duì)各片調(diào)用piece.quantile(0.9),最后將這些結(jié)果組裝成最終結(jié)果。
使用自己的聚合函數(shù),傳入aggregate或agg方法即可:
有些方法如describe也可以用,但嚴(yán)格來講它們并非聚合運(yùn)算。
自定義聚合函數(shù)比表中的經(jīng)過優(yōu)化的函數(shù)慢得多,這是因?yàn)樵跇?gòu)造中間分組數(shù)據(jù)塊時(shí)存在非常大的開銷(函數(shù)調(diào)用、數(shù)據(jù)重排等)。
面向列的多函數(shù)應(yīng)用
根據(jù) "smoker" 和 "size" 對(duì) tips 進(jìn)行分組:
傳入一組函數(shù)或函數(shù)名,得到的DataFrame的列就會(huì)以相應(yīng)的函數(shù)命名:
傳入一個(gè)由(name, function )元組組成的列表,各元組的第一個(gè)元素會(huì)被用作DataFrame的列名:
對(duì)于DataFrame,定義一組應(yīng)用于全部列的函數(shù),或不同的列應(yīng)用不同的函數(shù)。
結(jié)果的DataFrame擁有層次化的列。相當(dāng)于分別對(duì)列["tip_pct"]和列["total_bill"]進(jìn)行聚合,然后用concat將結(jié)果組裝到一起(列名用作 keys 參數(shù))。
傳入帶有自定義名稱的元組列表:
對(duì)不同的列應(yīng)用不同的函數(shù):向agg傳入一個(gè)從列名映射到函數(shù)的字典
只有將多個(gè)函數(shù)應(yīng)用到至少一列時(shí),DataFrame才會(huì)擁有層次化的列:
以“無索引”的形式返回聚合數(shù)據(jù)
向groupby傳入as_index=False,禁用功能由唯一的分組鍵組成索引:
聚合只是分組運(yùn)算的其中一種,它接受能夠?qū)⒁痪S數(shù)據(jù)簡(jiǎn)化為標(biāo)量值的函數(shù)。
接下來介紹 transform 和 apply 方法,執(zhí)行更多其他的分組運(yùn)算。
為一個(gè)DataFrame添加一個(gè)用于存放各索引分組平均值的列:先聚合再合并。
下面在GroupBy上使用transform方法:
transform會(huì)將一個(gè)函數(shù)應(yīng)用到各個(gè)分組,然后將結(jié)果放置到適當(dāng)?shù)奈恢蒙稀?/p>
從各組中減去平均值:先創(chuàng)建一個(gè)距平化函數(shù)(demeaning function),然后將其傳給transform。
檢查demeaned現(xiàn)在的分組平均值是否為 0:
跟aggregate一樣,transform也是一個(gè)有著嚴(yán)格條件的特殊函數(shù),傳入的函數(shù)只能產(chǎn)生兩種結(jié)果,一個(gè)可以廣播的標(biāo)量值(如 np.mean) 或一個(gè)相同大小的結(jié)果數(shù)組。
apply:一般性的“拆分-應(yīng)用-合并”
最一般化的GroupBy方法是apply:apply會(huì)將待處理的對(duì)象拆分成多個(gè)片段,然后對(duì)各片段調(diào)用傳入的函數(shù),最后嘗試將各片段組合到一起。
根據(jù)分組選出最高的 5 個(gè)tip_pct值:編寫一個(gè)函數(shù),在指定列找出最大值,然后把這個(gè)值所在的行選取出來。
對(duì)smoker分組并用該分組函數(shù)調(diào)用apply,得到:
top函數(shù)在DataFrame的各個(gè)片段上調(diào)用,然后結(jié)果由pandas.concat組裝到一起,并以分組名稱進(jìn)行了標(biāo)記。
最后結(jié)果就有了一個(gè)層次化索引,其內(nèi)層索引值來自原DataFrame。
如果傳給apply的函數(shù)能夠接受其他參數(shù)或關(guān)鍵字,可以將這些內(nèi)容放在函數(shù)名后面一并傳入:
在GroupBy對(duì)象上調(diào)用describe:
在GroupBy中,當(dāng)調(diào)用如describe之類的方法時(shí),實(shí)際上只是應(yīng)用了下面兩條代碼的快捷方式:
除這些基本用法之外,能否充分發(fā)揮apply的威力很大程度上取決于你的創(chuàng)造力,傳入的哪個(gè)函數(shù)能做什么全由你說了算,它只需返回一個(gè)pandas 對(duì)象或標(biāo)量值即可。
禁止分組鍵
分組鍵會(huì)跟原始對(duì)象的索引共同構(gòu)成結(jié)果對(duì)象中的層次化索引,將group_keys=False傳入groupby即可禁止該效果:
分位數(shù)和桶分析
pandas有一些能根據(jù)指定面元或樣本分位數(shù)將數(shù)據(jù)拆分成多塊的工具(cut 和 qcut),將這些函數(shù)跟groupby結(jié)合起來,就能非常輕松地實(shí)現(xiàn)對(duì)數(shù)據(jù)集的桶或分位數(shù)分析了。
桶:bucket
分位數(shù):quantile
“長(zhǎng)度相等的桶”指的是“區(qū)間大小相等”,“大小相等的桶”指的是“數(shù)據(jù)點(diǎn)數(shù)量相等”。
利用cut將其裝入長(zhǎng)度相等的桶中:
由cut返回的Factor對(duì)象可直接用于groupby,可以對(duì)data2做一些統(tǒng)計(jì)計(jì)算:
要根據(jù)樣本分位數(shù)得到大小相等的桶,使用qcut:
傳入labels=False,即可只獲取分位數(shù)的編號(hào)。否則那段還是區(qū)間而不是編號(hào):
示例:用特定于分組的值填充缺失值
對(duì)于缺失數(shù)據(jù)的清理工作,有時(shí)用dropna將其濾除,有時(shí)則希望用一個(gè)固定值或由數(shù)據(jù)集本身所衍生出來的值去填充NA值,用fillna這個(gè)工具。
如用平均值去填充NA值:
對(duì)不同的分組填充不同的值:將數(shù)據(jù)分組,并使用apply和一個(gè)能夠?qū)Ω鲾?shù)據(jù)塊調(diào)用fillna的函數(shù)即可。
用這個(gè)分組平均值去填充NA值:
也可以在代碼中預(yù)定義各組的填充值,由于分組具有一個(gè)name 屬性:
示例:隨機(jī)采樣和排列
從一個(gè)大數(shù)據(jù)集中隨機(jī)抽取樣本以進(jìn)行蒙特卡羅模擬(Monte Carlo simulation)或其他分析工作。抽取的方式很多,其中的一些效率會(huì)比其他的高很多
一個(gè)辦法是:選取np.random.permutation(N)的前K個(gè)元素,其中N為完整數(shù)據(jù)的大小,K為期望的樣本大小。
構(gòu)造一副撲克牌:
從整副牌中抽出 5 張:
從每種花色中隨機(jī)抽取兩張牌,由于花色是牌名的最后一個(gè)字符,可以據(jù)此進(jìn)行分組,并使用apply:
另一種方法:
示例:分組加權(quán)平均數(shù)和相關(guān)系數(shù)
例如對(duì)這個(gè)數(shù)據(jù)集利用category計(jì)算分組加權(quán)平均數(shù):
來自 Yahoo! Finance 的數(shù)據(jù)集:
計(jì)算一個(gè)由日收益率(通過百分?jǐn)?shù)變化計(jì)算)與 SPX 之間的年度相關(guān)系數(shù)組成的DataFrame:
計(jì)算列于列之間的相關(guān)系數(shù):(蘋果和微軟的年度相關(guān)系數(shù))
示例:面向分組的線性回歸
還是上個(gè)例子,定義下面這個(gè)regress函數(shù)(利用 statsmodels 庫(kù))對(duì)各數(shù)據(jù)塊執(zhí)行普通最小二乘法回歸(Ordinary Least Squares, OLS)。
按年計(jì)算 AAPL 對(duì) SPX 收益率的線性回歸:
透視表(pivot table)
是各種電子表格程序和其他數(shù)據(jù)分析軟件中一種常見的數(shù)據(jù)匯總工具。它根據(jù)一個(gè)或多個(gè)鍵對(duì)數(shù)據(jù)進(jìn)行聚合,并根據(jù)行和列上的分組鍵將數(shù)據(jù)分配到各個(gè)矩形區(qū)域中。
在小費(fèi)數(shù)據(jù)集中,根據(jù)day和smoker計(jì)算分組平均數(shù)(pivot_table 的默認(rèn)聚合類型):
只想聚合tip_pct和size,并根據(jù)day進(jìn)行分組:
傳入margins=True添加分項(xiàng)小計(jì),將會(huì)添加標(biāo)簽為All的行和列,其值對(duì)應(yīng)于單個(gè)等級(jí)中所有數(shù)據(jù)的分組統(tǒng)計(jì)。
這里All值為平均數(shù)。
要使用其他的聚合函數(shù),將其傳給aggfunc即可。例如使用count或len得到有關(guān)分組大小的交叉表:
存在NA值,就設(shè)置一個(gè)fill_value:
交叉表(crosstab)
是一種用于計(jì)算分組頻率的特殊透視表。
用pandas.crosstab函數(shù)(pivot_table 也能實(shí)現(xiàn)該功能:根據(jù) Nationality 和 Handedness 對(duì)這段數(shù)據(jù)進(jìn)行匯總):
crosstab的前兩個(gè)參數(shù)可以是數(shù)組、Series、數(shù)組列表:
示例:2012聯(lián)邦選舉委員會(huì)數(shù)據(jù)庫(kù)加載數(shù)據(jù)
抽取有關(guān)贊助人和贊助模式的統(tǒng)計(jì)信息。
通過unique,可以獲取全部的候選人名單:
利用字典說明黨派關(guān)系:
通過這個(gè)映射以及 Series對(duì)象的map方法,可以根據(jù)候選人姓名得到一組黨派信息:
注意,該數(shù)據(jù)集既包括贊助也包括退款(負(fù)的出資額),為了簡(jiǎn)化分析過程,限定該數(shù)據(jù)集只能有正的出資額:
由于 Barack Obama 和 Mitt Romney 是最主要的兩名候選人,專門準(zhǔn)備了一個(gè)子集,只包含針對(duì)他們兩人的競(jìng)選活動(dòng)的贊助信息:
根據(jù)職業(yè)和雇主統(tǒng)計(jì)贊助信息
首先,根據(jù)職業(yè)計(jì)算出資總額:
這里只列出了前10個(gè),注意到 許多職業(yè)都涉及相同的基本工作類型或同一樣?xùn)|西有多種變體,清理一些這樣的數(shù)據(jù):將一個(gè)職業(yè)信息映射到另一個(gè)。
對(duì)雇主信息也進(jìn)行了同樣的處理。
這里利用了dict.get,它允許沒有映射關(guān)系的職業(yè)也能“通過”。
現(xiàn)在,可以通過pivot_table根據(jù)黨派和職業(yè)對(duì)數(shù)據(jù)進(jìn)行聚合,然后過濾掉總出資額不足 200 萬美元對(duì)數(shù)據(jù):
做成柱狀圖:
對(duì) Obama 和 Romney 總出資額最高的職業(yè)和企業(yè):先對(duì)候選人進(jìn)行分組,然后求取最大值:
對(duì)出資額分組
利用cut函數(shù)根據(jù)出資額的大小將數(shù)據(jù)離散化到多個(gè)面元中:
根據(jù)候選人姓名以及面元標(biāo)簽對(duì)數(shù)據(jù)進(jìn)行分組:
對(duì)出資額求和并在面元內(nèi)規(guī)格化,以便圖形化顯示兩位候選人各種贊助額度的比例:
根據(jù)州統(tǒng)計(jì)贊助信息
首先,根據(jù)候選人和州對(duì)數(shù)據(jù)進(jìn)行聚合:
對(duì)各行除以總贊助額,就得到各候選人在各州的總贊助額比例:
不足之處,歡迎指正。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/44765.html
摘要:中面向行和面向列的操作基本是平衡的。用層次化索引,將其表示為更高維度的數(shù)據(jù)。使用浮點(diǎn)值表示浮點(diǎn)和非浮點(diǎn)數(shù)組中的缺失數(shù)據(jù)。索引的的格式化輸出形式選取數(shù)據(jù)子集在內(nèi)層中進(jìn)行選取層次化索引在數(shù)據(jù)重塑和基于分組的操作中很重要。 我們?cè)谏弦黄榻B了 NumPy,本篇介紹 pandas。 pandas入門 Pandas 是基于Numpy構(gòu)建的,讓以NumPy為中心的應(yīng)用變的更加簡(jiǎn)單。 pandas...
摘要:提供了使我們能夠快速便捷地處理結(jié)構(gòu)化數(shù)據(jù)的大量數(shù)據(jù)結(jié)構(gòu)和函數(shù)。結(jié)構(gòu)化數(shù)據(jù),例如多維數(shù)據(jù)矩陣表格行數(shù)據(jù),其中各列可能是不同的類型字符串?dāng)?shù)值日期等?;A(chǔ)數(shù)組和矢量計(jì)算高性能科學(xué)計(jì)算和數(shù)據(jù)分析的基礎(chǔ)包。 本篇內(nèi)容為整理《利用Python進(jìn)行數(shù)據(jù)分析》,博主使用代碼為 Python3,部分內(nèi)容和書本有出入。 利用 Python 進(jìn)行科學(xué)計(jì)算的實(shí)用指南。本書重點(diǎn)介紹了用于高效解決各種數(shù)據(jù)分析問...
摘要:有一些表示常見圖形的對(duì)象稱為塊,完整的集合位于。中的繪圖函數(shù)在中,有行標(biāo)簽列標(biāo)簽分組信息。密度圖通過計(jì)算可能會(huì)產(chǎn)生觀測(cè)數(shù)據(jù)的連續(xù)概率分布的估計(jì)而產(chǎn)生的。在探索式數(shù)據(jù)分析工作中,同時(shí)觀察一組變量的散布圖是很有意義的。 我們?cè)谏弦黄榻B了 pandas,本篇介紹 matplotlib。 繪圖和可視化 一個(gè)用于創(chuàng)建出版質(zhì)量圖表的桌面繪圖包。 Matplotlib API入門 Figure ...
摘要:全棧數(shù)據(jù)之門前言自強(qiáng)不息,厚德載物,自由之光,你是我的眼基礎(chǔ),從零開始之門文件操作權(quán)限管理軟件安裝實(shí)戰(zhàn)經(jīng)驗(yàn)與,文本處理文本工具的使用家族的使用綜合案例數(shù)據(jù)工程,必備分析文件探索內(nèi)容探索交差并補(bǔ)其他常用的命令批量操作結(jié)語快捷鍵,之門提高效率光 showImg(https://segmentfault.com/img/bVK0aK?w=350&h=350); 全棧數(shù)據(jù)之門 前言 自強(qiáng)不息,...
閱讀 1833·2021-10-11 10:57
閱讀 2454·2021-10-08 10:14
閱讀 3460·2019-08-29 17:26
閱讀 3469·2019-08-28 17:54
閱讀 3080·2019-08-26 13:38
閱讀 3001·2019-08-26 12:19
閱讀 3674·2019-08-23 18:05
閱讀 1360·2019-08-23 17:04