首頁 >
熱門文章 >
大數據分析 > 大數據分析Pandas和Python如何合并數據表
大數據分析Pandas和Python如何合并數據表
時間:2020-09-29來源:www.5wd995.cn點擊量:738次作者:Sissi
時間:2020-09-29點擊量:738次作者:Sissi
你將很難找到不需要串聯的大數據分析項目(將多個數據源組合在一起)。通常,數據分析要求將新行添加到表中,在更復雜的情況下(在更復雜的情況下)拉出更多列,將不同的表合并到一個公共鍵上。所有這些技巧都可以輕松地放在口袋里,因此不同的數據源不會妨礙你的分析!
在此串聯教程中,我們將逐步介紹幾種使用熊貓組合數據的方法。它面向初學者到中級,并且需要了解熊貓DataFrame的基礎知識。對SQL和關系數據庫的一些事先了解也將派上用場,但不是必需的。我們將分析四種國家的平均年度勞動時間,并介紹四種不同的技術(連接,附加,合并和合并)。我們還將在每個步驟之后創(chuàng)建一個圖,以便我們直觀地了解每種數據組合技術所產生的不同結果。作為獎勵,你將在大數據分析Pandas和Python如何合并數據表中獲得有關全球勞動力趨勢的見解以及可添加到你的投資組合中的漂亮圖表集!
我們將在經濟合作與發(fā)展組織(OECD)中扮演宏觀經濟分析師的角色。我們試圖回答的問題很簡單,但很有趣:哪個國家的公民投入了最長的工作時間,這些趨勢隨著時間的推移如何變化?不幸的是,經合組織一直在分別收集不同大陸和不同時期的數據。我們的工作是首先將所有數據放在一個位置,以便我們進行必要的分析。
訪問數據集
在此處下載教程數據文件
我們將使用來自OECD就業(yè)和勞動力市場統計數據庫的數據,該數據庫提供了可追溯至1950年的大多數發(fā)達國家的平均年度勞動小時數據。在大數據分析Pandas和Python如何合并數據表中,我將互換使用DataFrames和表格。我們將在Python 3中使用Jupyter Notebook(歡迎使用你希望使用的任何IDE(集成開發(fā)環(huán)境),但是在Jupyter中最容易遵循大數據分析Pandas和Python如何合并數據表)。啟動后,讓我們導入pandas和matplotlib庫,然后使用%matplotlb inlineJupyter知道如何在筆記本單元格中顯示圖。如果我提到的任何工具聽起來都不熟悉,建議你參閱AAA教育入門指南。
接下來,我們將使用該pd.read_csv()函數打開前兩個數據文件。我們將通過傳遞參數指定將第一列用作行索引index_col=0。最后,我們將顯示初始表的外觀。
經過一番觀察,我們發(fā)現行是國家,列是年,單元格值是每位員工的平均每年工作時間。盡管DataFrames輝煌,但乍一看仍然很難理解,因此我們將使用matplotlib的DataFrame.plot()方法為我們的年度勞動趨勢創(chuàng)建折線圖,進行一些繪圖。
哇,那不是我們想要的!默認情況下,該DataFrame.plot()方法將行視為x軸標簽,將單元格值視為y軸標簽,將列視為線。此處的快速解決方案是使用DataFrame.transpose()方法在DataFrame上旋轉軸。為了使可視化效果更加出色,我們將title='string'在plot方法中使用參數添加標題。我們可以將這些方法鏈接在一起,然后用于plt.show()整齊地顯示我們的折線圖,而繪圖上方沒有matplotlib文本行。
連接美洲數據
看起來我們在north_americaDataFrame中有三個國家,在DataFrame中有一個國家south_america。由于這些是在兩個單獨的圖中,因此很難比較南美和北美的平均勞動時間。如果我們能夠將所有國家/地區(qū)納入同一個數據框,則進行此活動會容易得多。
對于需要添加相同長度的行或列的簡單操作,此pd.concat()功能非常理想。我們要做的就是按照我們希望它們串聯的順序傳遞一個DataFrame對象列表。
a)軸:我們將沿著行(0)還是沿列(1)串聯
b)join:可以設置為內部,外部,左側或右側;大數據分析Pandas和Python如何合并數據表后面將更詳細地解釋
c)ignore_index:是否應保留原始行標簽
在我們的例子中,我們可以保留所有默認參數的原樣,而只需傳入我們north_america和south_americaDataFrames。
這看起來是一個不錯的開始,但是我們希望我們的數據盡可能的新。以后幾年要求提供這四個國家/地區(qū)的數據后,數據收集團隊從2011年到2015年每年通過單獨的CSV文件向我們發(fā)送以下信息:
[americas_2011.csv , americas_2012.csv, americas_2014.csv, americas_2015.csv]
讓我們使用一個for循環(huán)以及該string.format()方法自動執(zhí)行該過程的方法來加載新數據。我們將把我們之前的americasDataFrame放在一個名為的列表中,americas_dfs并將每個新DataFrame追加到該列表中。最后,我們將americas_2011使用列表索引顯示DataFrame。
你可能會注意到的一件事是,americas_2011我們剛打印的DataFrame中的行與DataFrame的順序americas不同(熊貓自動將它們按字母順序排列)。幸運的是,該pd.concat()函數將數據連接到索引標簽(在我們的情況下為國家)中,而不是順序中,因此在連接期間不會出現問題。如果我們想按當前順序將行連接起來,則可以傳遞參數ignore_index=True。這將導致為索引分配整數序列。同樣重要的是要記住,我們必須按照希望將其串聯的順序創(chuàng)建DataFrame列表,否則我們的年份將不按時間順序排列。
我們不能使用與pd.concat()上次完全相同的功能,因為現在我們要添加列而不是行。這是軸起作用的地方。默認情況下,參數設置為axis=0,這意味著我們正在串聯行。這次,我們將需要傳遞axis=1以指示我們要串聯列。請記住,這僅在所有表都具有相同的高度(行數)的情況下起作用。
堆棧溢出
沿軸1連接時要記住的一個警告是行索引的標題“國家”將被刪除。這是因為pandas不確定該標題是否適用于已添加的新行標簽。我們可以通過分配DataFrame.index.names屬性輕松地解決此問題。然后,讓我們作另一個圖以了解我們的位置。
追加其他大洲的數據
既然我們已經全面了解了美洲,那么我們想看看它與世界其他地區(qū)的比較。數據收集團隊已為2000年至2015年為亞洲,歐洲和南太平洋提供了CSV文件。讓我們加載這些文件并進行預覽。由于europe是一張高得多的桌子,我們將利用該DataFrame.head()方法通過僅顯示前5行來節(jié)省空間。
當你只想添加稱為DataFrame.append()方法的新行時,Pandas有一個快捷方式。語法略有不同–因為它是DataFrame方法,所以我們將使用點表示法在americas對象上調用它,然后將新對象作為參數傳遞。
看起來這些新的DataFrames已全部用了16年。如果我們嘗試追加的數據中缺少任何列,則將導致這些行NaN的單元格中的值落在缺少的年列之下。讓我們運行append方法,并驗證通過print正確地附加了所有國家DataFrame.index。然后,我們可以繪制折線圖以查看新附加數據的外觀。
自定義可視化
具有所有36個國家/地區(qū)的新DataFrame很棒,但是圣潔的行為確實使我們的計劃變得混亂!在繼續(xù)之前,請查看你是否可以發(fā)現我們的可視化存在的三個問題。
首先,我們要使圖更大,以便可以以更高的保真度看到所有這些新數據點。如果我們傳遞figsize=(10,10)參數,這是一個非常容易的解決方案,元組指定了繪圖圖的尺寸。你可能還已經注意到,有36條線代表我們所有不同的國家,但是顏色在重復。這是因為默認的顏色圖僅包含10種不同的顏色,但是我們將需要更多的顏色。我查看了matplotlib colormaps文檔,并決定使用彩虹圖,可以將其作為傳遞colormap='rainbow'。由于我們要放大圖表,因此我也想使用較粗的線,所以我要設置linewidth=2。
最后,我們將解決圖例中重疊的圖例。這可以通過plt.legend()功能來完成。我們將傳入loc='right'以指示我們想要圖右側的圖例框。你可以對其進行測試,并發(fā)現它與圖的邊界不完全對齊。我們可以對bbox_to_anchor=(1.3,0.5)參數進行一些微調。我們傳入的元組是圖例框相對于圖的位置坐標。我一直在研究這些值,直到找到一個可以排列的值,但是如果你喜歡不同的美學,可以隨時修改這四個參數中的任何一個。
連接入門
對于那些在SQL之類的關系數據庫中進行聯接的經驗豐富的人,這里有一些好消息:pandas提供了高性能的內存中合并和聯接選項。當我們需要組合非常大的DataFrame時,聯接是快速執(zhí)行這些操作的有力方法。
需要牢記的幾個重要事項:一次只能在兩個DataFrame上進行連接,分別表示為左表和右表。該鍵是普通列,這兩個DataFrames將加入的。最好使用在整個列中具有唯一值的鍵,以避免行值的意外復制。
有四種處理聯接的基本方法(內部,左側,右側和外部),具體取決于哪些行必須保留其數據。下面的維恩圖將幫助你直觀地理解這些連接??紤]將藍色區(qū)域作為鍵列的一部分,它將保留在最終表中。
一個內連接是最簡單的聯接,這樣只會保留其中兩個表共用一個鍵值的行。
一個左連接不斷出現在主(左)表中的所有行,右表僅將對把它分享與左的一個關鍵值的行串連。NaN將為沒有匹配鍵值的單元格填充值。
一個右連接是同一個概念作為左加入,但保持在右表中出現的所有行。所得的DataFrameNaN在左側將具有任何可能的值。
最后,完全外部NaN聯接保留了兩個表中都出現的所有行,并且值可以顯示在結果DataFrame的任一側。
合并歷史勞工數據
很高興能夠看到自2000年以來的工時變化,但是為了看到真實的趨勢,我們希望能夠看到盡可能多的歷史數據。數據收集團隊非常友好,可以發(fā)送從1950年到2000年的數據,讓我們將其加載并進行查看。
你會注意到其中有很多NaN價值,尤其是在早期。這僅意味著在較早的年份中沒有收集到這些國家的數據。在這些單元格中放入0會產生誤導,因為這意味著該年沒有人花任何時間工作!而是NaN代表一個空值,表示“不是數字”。具有空值不會影響我們的DataFrame合并,因為我們將使用行標簽(索引)作為鍵。
合并時,請務必記住將從每個表保留哪些行。我不確定表的完整尺寸是多少,因此,除了顯示全部內容之外,我們還可以查看感興趣的事實。讓我們打印DataFrame.shape()屬性以查看包含(總行,總列)的元組對于兩個表。
請注意,即使我們僅分析世界表中的36個國家,歷史表也有39行。通過適當的DataFrame合并,可以自動處理掉多余的三行。我們將把它world作為主表,希望它在結果DataFrame的右側,而歷史在左側,因此年份(列)按時間順序排列。這兩個表中的列都是不同的,這意味著我們將必須找到要連接的鍵。在這種情況下,鍵將是行索引(國家/地區(qū))。
我們將要使用該pd.merge()函數進行正確的聯接,并使用索引作為聯接的鍵。
使用此函數時,前兩個參數將始終分別為左和右DataFrame。然后,我們要設置left_index=True并right_index=True指定索引將是我們的鍵值,因此我們可以將國家/地區(qū)保留為行標簽(否則熊貓會將行索引更改為整數序列。)最后,我們傳入how='right'以指示正確的加入。
正確的聯接將確保我們僅保留正確表中的36行,并丟棄歷史記錄表中多余的3行。讓我們打印生成的DataFrame的形狀并顯示頭部,以確保一切都正確。
更快的加入方式
現在,我們已經完成了艱苦的工作,并從概念上理解了表合并,現在讓我們嘗試一種更優(yōu)雅的技術。熊貓有一個干凈的方法可以加入索引,這非常適合我們的情況。
該DataFrame.join()方法允許我們在左表上使用點符號,然后將右表how作為參數傳遞。這樣就無需像在上一個函數中那樣指定左右索引參數。如果為on=None,則連接鍵將為行索引。讓我們通過查看DataFrame頭來觀察空值如何影響我們的分析。
看起來很多行在DataFrame的左側都有空值,正如我們期望的那樣,使用右連接。在繪制最終的折線圖之前,最好按字母順序對行進行排序,以使圖例更易于讀者閱讀??梢允褂肈ataFrame.sort_index()方法執(zhí)行。我們可以傳入參數inplace=True以避免重新分配world_historical變量。然后,只需重用我們最近的vizualization中的matplotlib代碼即可顯示我們最終排序的DataFrame。
放在一起(雙關語意)
哇,既然我們對半個多世紀以來的勞動趨勢有了很大的了解,那么我們的可視化效果就令人印象深刻。成為80年代的工人肯定會筋疲力盡!
總結一下:
1)pd.concat() 功能:用途最廣,可用于沿任一軸組合多個DataFrame。
2)DataFrame.append() 方法:將行添加到DataFrame的快速方法,但不適用于添加列。
3)pd.merge() 函數:當我們有一個包含公用值的列(鍵)時,非常適合將兩個DataFrame結合在一起。
4)DataFrame.join() 方法:連接兩個DataFrame的一種更快的方法,但是僅在索引標簽上起作用,而不是在列上起作用。