溫故知新總結(jié):
- 任何更改在處理的DataFrame净赴, 可能會對最初使用的基本DataFrame產(chǎn)生影響火诸。
- 換句話說:明確地使用一個(gè)副本该窗, 那么應(yīng)該首先考慮在DataFrame上調(diào)用copy方法酌心。
- 可以通過使用skiprows參數(shù)來做到讓Pandas去忽略由數(shù)字組成的第一行。
- 使用 rename 更改 col 名字挑豌,并使用 inplace屬性
Dataframe Indexing and Loading
常見的工作流程是將數(shù)據(jù)讀入DataFrame安券, 然后將該DataFrame減少到有興趣處理的特定的列(column) 或行(row)墩崩。Pandas的工具組試圖給 DataFrame的視圖。這是比復(fù)制資料快得多侯勉,和更有效率的使用記憶體鹦筹。但是它意味著, 任何更改在處理的DataFrame址貌, 可能會對最初使用的基本DataFrame產(chǎn)生影響铐拐。
以下是使用相同的采購DataFrame的例子×范裕可以使用方括號創(chuàng)建一個(gè)列表遍蟋,只查看cost類別∶荆可以通過(broadcasting)來增加這個(gè)列表里的費(fèi)用虚青。對比原來的DataFrame,新的費(fèi)用也增加了螺男。
這是值得注意的重要考慮因素棒厘。如果要明確地使用一個(gè)副本蹄葱, 那么應(yīng)該首先考慮在DataFrame上調(diào)用copy方法醇坝。
通常的工作流程是讀取一些外部的文件數(shù)據(jù)集惭缰。使用這些dictionary來創(chuàng)建一個(gè)Pandas的DataFrame端三。Pandas有內(nèi)置的支持情萤,對于 例如分隔文件(如.CSV文件)以及各種 其他數(shù)據(jù)格式宾抓,包括關(guān)連資料庫零院,Excel和HTML表劳吠。
可以使用shell命令cat來查看這個(gè)文件迫筑∠芨希可以直接調(diào)用使用驚嘆號(!)
常識:當(dāng)Jupyter筆記本看到一行操作 以驚嘆號開始的時(shí),會將其余的命令發(fā)送到操作系統(tǒng)shell去進(jìn)行評估脯燃。所以cat可以運(yùn)行在Linux和Mac以及Coursera平臺上搂妻, 但可能無法在Windows上運(yùn)行。
這個(gè)是 olympics.csv的CSV文件辕棚, 其中包含維基百科的數(shù)據(jù)欲主,包含了獎(jiǎng)牌的總結(jié)列表, 關(guān)于各國在奧運(yùn)會贏得的逝嚎。
DataFrame中的第一行(row)數(shù)據(jù) 是我們希望看到的列名標(biāo)簽扁瓢。數(shù)據(jù)中的第一列(column)似乎也是國家的名稱, 我們想用它來做成索引(index)补君。重新導(dǎo)入數(shù)據(jù)引几,和設(shè)置索引值index_col為0,這是第一列挽铁, 并設(shè)置列的標(biāo)簽從第二行數(shù)據(jù)來讀取伟桅。
可以通過使用skiprows參數(shù)來做到讓Pandas去忽略由數(shù)字組成的第一行敞掘。
這些頁面沒有用金,銀和 銅牌楣铁,而是用一個(gè)漂亮的小圖標(biāo)玖雁,加上一個(gè)1,一個(gè)2盖腕, 另外一個(gè)3在里面赫冬。在我們的csv文件中,它們用字串01溃列!來表示 劲厌,02!我們看到列(column)的值被重復(fù)哭廉,這不是很好的做法脊僚。 Pandas認(rèn)識到這一點(diǎn),而附加了.1和.2遵绰,使標(biāo)簽更加獨(dú)特辽幌。但是這個(gè)標(biāo)簽并不是很清楚,所以我們應(yīng)該清理數(shù)據(jù)文件椿访∥谄螅可以使用Pandas name屬性設(shè)置列的名稱。
Pandas存儲所有列的列表在.columns屬性中成玫〖咏停可以通過遍歷該列表來更改列名的值, 使用dataframe的rename方法哭当。
在這里猪腕,我們只是遍歷所有列的值,看看它們是否 以01钦勘,02陋葡,03或數(shù)字符開始。如果他們是彻采,我們可以呼叫rename函數(shù)腐缤, 并將列參數(shù)設(shè)置為dictionary,用的key是我們要替換的column肛响, value是我們想要的新值岭粤。
這里我們把一些舊的值分成兩部分, 因?yàn)槲覀儾幌胧ノㄒ坏母郊又怠?br> 我們還會將非常重要的inplace參數(shù)設(shè)為true特笋, 以便Pandas知道直接更新此DataFrame剃浇。
Querying a DataFrame
boolean masking
是NumPy快速高效查詢的核心。它類似于在其他計(jì)算領(lǐng)域使用的masking。
boolean masking
是一個(gè)陣列(atrray)偿渡,它可以是一維度像一個(gè)列表(series)臼寄,或者 二維度像DataFrame這樣的霸奕,array中的每個(gè)值都是true或false溜宽。這個(gè)array基本上覆蓋在我們查詢的數(shù)據(jù)結(jié)構(gòu)之上。任何單元格與true都將被允許進(jìn)入我們的最終結(jié)果质帅, 任何單元格與false對齊的就不能夠适揉。
boolean masking
在概念上是強(qiáng)大的, 是高效的NumPy和Pandas查詢的基石煤惩。這種技術(shù)在計(jì)算機(jī)科學(xué)的其他領(lǐng)域中被廣泛使用嫉嘀, 例如圖形學(xué)。但是在其他傳統(tǒng)的關(guān)連資料庫中并沒有類似的魄揉。創(chuàng)建boolean masking
通過將操作符直接應(yīng)用于Pandas列表或 DataFrame對象剪侮。
例如,在我們的奧運(yùn)數(shù)據(jù)集中洛退,您可能只想看到 在夏季奧運(yùn)會上獲得金牌的國家瓣俯。要構(gòu)建此查詢的布林遮罩,我們投影金牌('Gold')列兵怯,使用索引運(yùn)算符彩匕, 并應(yīng)用比較值為大于零(>0)的運(yùn)算符。這實(shí)際上是廣播比較(comparison)運(yùn)算符媒区, 大于(>)驼仪,其結(jié)果為Boolean系列。所得到的是有索引的系列袜漩,每個(gè)單元格是True或 False绪爸,根據(jù)一個(gè)國家是否贏得了至少一枚金牌, 并且索引是國家名稱宙攻,
所以我們建立了boolean masking
奠货,然而這只是一半而已。接下來我們要做的是覆蓋該遮罩(mask)在DataFrame上粘优。
可以使用where函數(shù)來做到這一點(diǎn)仇味。 where函數(shù)將boolean masking
作為條件,將其應(yīng)用于DataFrame或series雹顺, 并返回一個(gè)相同形狀的新DataFrame或series丹墨。我們將這個(gè)boolean masking
應(yīng)用于我們的奧運(yùn)數(shù)據(jù)并創(chuàng)建一個(gè)DataFrame - 只有那些在夏季比賽中贏得金牌的國家。
產(chǎn)生的DataFrame保留了原始的索引嬉愧, 只保留了滿足條件的國家/地區(qū)的數(shù)據(jù)贩挣。
所有不符合條件的國家只有NaN數(shù)據(jù)。 大多數(shù)DataFrame內(nèi)置的統(tǒng)計(jì)功能忽略NaN的值。
如果我們用count()在only_gold DataFrame中王财, 有100個(gè)國家在夏季奧運(yùn)中獲得了金牌卵迂。
如果我們用count()在原始的df DataFrame, 有147個(gè)國家總數(shù)绒净。
通常我們想刪除那些沒有數(shù)據(jù)的行(row)见咒。為此可以使用dropna()功能」医可以選擇提供dropna()應(yīng)該考慮的軸(axis)改览。請記住,軸只是指示列(column)或行(row)缤言, 預(yù)設(shè)值為0宝当,這意味著行(row)。
這里是一個(gè)更簡潔的例子胆萧,說明如何查詢這個(gè)DataFrame庆揩。
這種方式查詢DataFrame時(shí),注意到?jīng)]有NaN跌穗。 Pandas自動(dòng)過濾掉沒有值的行订晌。
如果不習(xí)慣用布林(boolean)或位(bit)遮蔽來 減少數(shù)據(jù) 兩個(gè)boolean masking,當(dāng)進(jìn)行邏輯比較運(yùn)算瞻离,其輸出是 是另一個(gè)boolean masking腾仅。這意味著您可以鏈接一堆a(bǔ)nd/or語句 以創(chuàng)建更復(fù)雜的查詢,結(jié)果仍然是單個(gè)boolean masking套利。