色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

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

          Pandas 的Merge函數(shù)詳解(1)

          發(fā)布人:數(shù)據(jù)派THU 時(shí)間:2023-08-22 來(lái)源:工程師 發(fā)布文章

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

          圖片

          merge

          merge函數(shù)是Pandas中執(zhí)行基本數(shù)據(jù)集合并的首選函數(shù)。函數(shù)將根據(jù)給定的數(shù)據(jù)集索引或列組合兩個(gè)數(shù)據(jù)集。

          我們使用下面試示例:

           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]})

          圖片

          我們嘗試模擬兩個(gè)不同的數(shù)據(jù)集:客戶和訂單數(shù)據(jù),其中cust_id列同時(shí)存在于兩個(gè)DataFrame中。

           pd.merge(customer, order)

          圖片

          默認(rèn)情況下,merge函數(shù)是這樣工作的:

          將按列合并,并嘗試從兩個(gè)數(shù)據(jù)集中找到公共列,使用來(lái)自兩個(gè)DataFrame(內(nèi)連接)的列值之間的交集。

          列和索引合并

          在上面合并的數(shù)據(jù)集中,merge函數(shù)在cust_id列上連接兩個(gè)數(shù)據(jù)集,因?yàn)樗俏ㄒ坏墓擦小N覀円部梢灾付ㄒ趦蓚€(gè)數(shù)據(jù)集上連接的列名。

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



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



          結(jié)果與前面的示例類似,因?yàn)閏ust_id是唯一的公共列。但是如果兩個(gè)DataFrame都包含兩個(gè)或多個(gè)具有相同名稱的列,則這個(gè)參數(shù)就很重要。


          我們來(lái)創(chuàng)建一個(gè)包含兩個(gè)相似列的數(shù)據(jù)。

          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']                      })

          圖片

          數(shù)據(jù)集現(xiàn)在包含兩個(gè)名稱相似的列:cust_id和country。讓我們看看如果使用默認(rèn)方法合并兩個(gè)DataFrame會(huì)發(fā)生什么。



           pd.merge(customer, order)


          圖片


          只剩下一行了,這是因?yàn)閙erge函數(shù)將使用與鍵名相同的所有列來(lái)合并兩個(gè)數(shù)據(jù)集。所以現(xiàn)在是通過(guò)cust_id和country中找到的相同值來(lái)實(shí)現(xiàn)合并的。

          還有一個(gè)問(wèn)題,我們指定一個(gè)列后,其他的重復(fù)列(這里是country),現(xiàn)在存在country_x和country_y列。這兩列是來(lái)自各自數(shù)據(jù)集的國(guó)家列。country_x來(lái)自Customer數(shù)據(jù)集,country_y來(lái)自O(shè)rder數(shù)據(jù)集。

          為了幫助區(qū)分合并過(guò)程中相同列名的結(jié)果,我們可以將一個(gè)元組對(duì)象傳遞給suffix參數(shù)。

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

          圖片

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

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

          圖片

          這樣就不會(huì)造成混淆了。

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

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

          圖片

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

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

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

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

          圖片

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

          圖片

          當(dāng)我們按索引和列合并時(shí),DataFrame結(jié)果將由于合并(匹配的索引)會(huì)增加一個(gè)額外的列。

          合并類型介紹

          默認(rèn)情況下,當(dāng)我們合并數(shù)據(jù)集時(shí),merge函數(shù)將執(zhí)行Inner Join。在Inner Join中,根據(jù)鍵之間的交集選擇行。匹配在兩個(gè)鍵列或索引中找到的相同值。

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

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

          圖片

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

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

          圖片

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

          indicator=True參數(shù),將創(chuàng)建_merge列。在上面的結(jié)果中,可以看到兩個(gè)值都表明該行來(lái)自DataFrame和left_only的交集,其中該行來(lái)自第一個(gè)DataFrame(左側(cè))。

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

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

          圖片

          還可以在合并過(guò)程中使用外連接來(lái)保留兩個(gè)DataFrame。我們可以把外連接看作是同時(shí)進(jìn)行的左連接和右連接。

          圖片

          最后就是交叉連接,將合并兩個(gè)DataFrame之間的每個(gè)數(shù)據(jù)行。

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

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

          圖片

          DataFrame將Customer數(shù)據(jù)中的每一行都與Order數(shù)據(jù)結(jié)合起來(lái)。


          *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



          關(guān)鍵詞: AI

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉