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