首頁>技術>

pandas為我們提供了merge函式,它提供了類似於SQL中內聯接,外聯接的資料合併效果。我們看一下merge函式的宣告:

left和right引數為要進行合併的兩個DataFrame

how引數預設是inner,代表是內聯接,其它的引數值left,right,outer分別代表左聯接,右聯接和外聯接

on引數相當於我們在使用SQL時,where條件裡用於聯接的欄位

關於完整的引數含義,大家可以參考pandas的API參考手冊,由於本文並不涉及,受到文章篇幅的限制,我們就不一一介紹了。

下面我們先透過一個簡單的小程式,演示一下merge的基本用法。程式的原始碼如下:

我們假定有兩組資料分別為df1和df2,他們代表“哈爾濱分行”,“天津分行”,“大連分行”3家分行的資料,資料的內容為“發放金額”,“貸款餘額”和“逾期餘額”。現在我們有一個需求是把這3家分行的資料合併到一個報表上。

程式是透過第28行實現了此功能。left和right分別賦值為df1和df2,on引數指定的是“分行名稱”,這代表的是透過“分行名稱”,我們將對應的資料進行聯接。“分行名稱”就相當於SQL語句進行內聯接時,where條件上用於聯接的欄位。

在這個例子中我們使用的是預設的內聯接,即how為inner。用於合併的資料,df1和df2中他們的“分行名稱”欄位,也是能一一對應上了。這保證了我們的資料在合併後仍然是3行資料。但是有的時候,我們要合併的資料並不能一一對應,這時如果我們還要把所有的行都展示出來,就需要使用外聯接,即outer。下面我們透過一個程式演示一下外聯接的效果。

在上面的程式中,我們設計了2個DataFrame,它們的“分行名稱”不是一一對應的。大家可以注意一下第1個DataFrame中的“重慶分行”、第2個DataFrame中的“成都分行”,都是對方資料中沒有的行。

這樣的兩個DataFrame,如果要進行內聯接的話,而只會保留擁有相同欄位的行。程式的第30行,預設進行了內聯絡,程式的執行效果如下圖所示。

如果我們想把無法對應上的“重慶分行”和“成都分行”也合併到一起,這時我們就需要指定how引數為outer,即程式第34行所示。這也就相當於SQL中的外連線。程式的執行效果如下所示。

由於“重慶分行”沒有對應的“逾期餘額”列,而“成都分行”沒有對應的“發放金額”和“貸款餘額”列,所以在合併後,這些欄位的內容就為NaN,即代表空值。如果我們用to_excel匯出到excel檔案的話,對應的單元格將什麼內容也沒有。如果我們不希望空值裡什麼都不展示,而是把空值設定為0,那麼我們可以透過fillna函式處理一下。例如程式第38行。下圖為處理後的效果,整個報表的資料如果為空就都填充為0了。

在實際工作中,我們用於聯接的欄位有可能不止一個,merge函式也支援多個欄位聯接。下面我們透過一個例項演示一下如何處理多欄位聯接的場景。

現在我們在原有DataFrame的基礎上,增加一個“客戶型別”欄位,即法人或者個人。

當我們要聯接這個資料時,我們的on引數應該傳遞一個列表(list)。透過list,將多個欄位傳入merge函式。

開發環境:Windows 7 + Python 2.7.17 + PyCharm Community Edition 2016.1.5

11
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 為什麼有些高階開發人員不喜歡Python