博客專欄

        EEPW首頁 > 博客 > Pandas 的Merge函數詳解(1)

        Pandas 的Merge函數詳解(1)

        發布人:數據派THU 時間:2023-08-22 來源:工程師 發布文章

        在日常工作中,我們可能會從多個數據集中獲取數據,并且希望合并兩個或多個不同的數據集。這時就可以使用Pandas包中的Merge函數。在本文中,我們將介紹用于合并數據的三個函數merge、merge_ordered、merge_asof。

        圖片

        merge

        merge函數是Pandas中執行基本數據集合并的首選函數。函數將根據給定的數據集索引或列組合兩個數據集。

        我們使用下面試示例:

         import pandas as pd
         customer = pd.DataFrame({'cust_id': [1,2,3,4,5],                    'cust_name': ['Maria', 'Fran', 'Dominique', 'Elsa', 'Charles'],                    'country': ['German', 'Spain', 'Japan', 'Poland', 'Argentina']})
         order = pd.DataFrame({'order_id': [200, 201,202,203,204],                      'cust_id':[1,3,3,4,2],                      'order_date': ['2014-07-05', '2014-07-06', '2014-07-07', '2014-07-07', '2014-07-08'],                      'order_value': [10.1, 20.5, 18.7, 19.1, 13.5]})

        圖片

        我們嘗試模擬兩個不同的數據集:客戶和訂單數據,其中cust_id列同時存在于兩個DataFrame中。

         pd.merge(customer, order)

        圖片

        默認情況下,merge函數是這樣工作的:

        將按列合并,并嘗試從兩個數據集中找到公共列,使用來自兩個DataFrame(內連接)的列值之間的交集。

        列和索引合并

        在上面合并的數據集中,merge函數在cust_id列上連接兩個數據集,因為它是唯一的公共列。我們也可以指定要在兩個數據集上連接的列名。

        如果兩個列的名稱都存在于兩個DataFrame中,則可以使用參數on。



         pd.merge(customer, order, on = 'cust_id')



        結果與前面的示例類似,因為cust_id是唯一的公共列。但是如果兩個DataFrame都包含兩個或多個具有相同名稱的列,則這個參數就很重要。


        我們來創建一個包含兩個相似列的數據。

        customer = pd.DataFrame({'cust_id': [1,2,3,4,5],                    'cust_name': ['Maria', 'Fran', 'Dominique', 'Elsa', 'Charles'],                    'country': ['German', 'Spain', 'Japan', 'Poland', 'Argentina']})
         order = pd.DataFrame({'order_id': [200, 201,202,203,204],                      'cust_id':[1,3,3,4,2],                      'order_date': ['2014-07-05', '2014-07-06', '2014-07-07', '2014-07-07', '2014-07-08'],                      'order_value': [10.1, 20.5, 18.7, 19.1, 13.5],                      'country' : ['German', 'Indonesia', 'Armenia', 'Singapore', 'Japan']                      })

        圖片

        數據集現在包含兩個名稱相似的列:cust_id和country。讓我們看看如果使用默認方法合并兩個DataFrame會發生什么。



         pd.merge(customer, order)


        圖片


        只剩下一行了,這是因為merge函數將使用與鍵名相同的所有列來合并兩個數據集。所以現在是通過cust_id和country中找到的相同值來實現合并的。

        還有一個問題,我們指定一個列后,其他的重復列(這里是country),現在存在country_x和country_y列。這兩列是來自各自數據集的國家列。country_x來自Customer數據集,country_y來自Order數據集。

        為了幫助區分合并過程中相同列名的結果,我們可以將一個元組對象傳遞給suffix參數。

         pd.merge(customer, order, on ='cust_id', suffixes = ('_customer', '_order'))

        圖片

        使用suffix參數,可以讓我們避免混淆,或者在合并前我們直接將列改名。

         customer = customer.rename(columns = {'country':'customer_country'})  order = order.rename(columns = {'country':'delivery_country'})

        圖片

        這樣就不會造成混淆了。

        然是如果我們要合并的列名在兩個數據集不同時,on參數就沒有效果了,這時就需要使用left_on和right_on參數,我們這里以剛剛改名的country列為例:

         pd.merge(customer, order, left_on = 'customer_country', right_on = 'delivery_country', suffixes = ('_customer', '_order'))

        圖片

        在上面的代碼中,我們將左側數據集(Customer)上想要合并的列傳遞給left_on參數,將右側數據集(Order)的列名傳遞給right_on參數。

        left_on和right_on參數是串聯工作的,因此我們不能在left_on參數中傳遞列名,而將right_on參數保留為空。

        我們也可以使用left_index和right_index來替換left_on和right_on參數。right_index和left_index參數控制merge函數,以根據索引而不是列連接數據集。

         pd.merge(customer, order, left_index = True, right_on = 'cust_id', suffixes = ('_customer', '_order'))

        圖片

        在上面的代碼將True值傳遞給left_index參數,表示希望使用左側數據集上的索引作為連接鍵。合并過程類似于下圖。

        圖片

        當我們按索引和列合并時,DataFrame結果將由于合并(匹配的索引)會增加一個額外的列。

        合并類型介紹

        默認情況下,當我們合并數據集時,merge函數將執行Inner Join。在Inner Join中,根據鍵之間的交集選擇行。匹配在兩個鍵列或索引中找到的相同值。

        下圖顯示了Inner Join圖,其中只選擇了Customer和Order數據集上的列和/或索引之間匹配的值。

         pd.merge(customer, order, left_on = 'customer_country',          right_on = 'delivery_country', suffixes = ('_customer', '_order'),        how = 'inner')

        圖片

        我們也可以使用左連接和右連接來保留想要的DataFrame。

         pd.merge(customer, order, left_on = 'customer_country',        right_on = 'delivery_country', suffixes = ('_customer', '_order'),         how = 'left', indicator = True)

        圖片

        上面的代碼,所有與訂單數據值不匹配的客戶數據值都用NaN值填充。

        indicator=True參數,將創建_merge列。在上面的結果中,可以看到兩個值都表明該行來自DataFrame和left_only的交集,其中該行來自第一個DataFrame(左側)。

        如果要執行右連接,可以使用以下代碼。

         pd.merge(customer, order, left_on = 'customer_country',       right_on = 'delivery_country', suffixes = ('_customer', '_order'),        how = 'right', indicator = True)

        圖片

        還可以在合并過程中使用外連接來保留兩個DataFrame。我們可以把外連接看作是同時進行的左連接和右連接。

        圖片

        最后就是交叉連接,將合并兩個DataFrame之間的每個數據行。

        讓我們用下面的代碼嘗試交叉連接。

         pd.merge(customer, order, how = 'cross', suffixes = ('_customer', '_order'))

        圖片

        DataFrame將Customer數據中的每一行都與Order數據結合起來。


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 漳平市| 三穗县| 牡丹江市| 湖口县| 镇雄县| 炉霍县| 方正县| 云浮市| 永和县| 南开区| 东台市| 洪江市| 华亭县| 宁德市| 凌云县| 安西县| 民乐县| 阿图什市| 资阳市| 冕宁县| 贵阳市| 衡阳县| 来宾市| 会同县| 靖安县| 营口市| 成安县| 千阳县| 全州县| 田阳县| 太仆寺旗| 任丘市| 青川县| 巴中市| 台州市| 纳雍县| 通道| 丽水市| 廉江市| 温泉县| 扎赉特旗|