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

          "); //-->

          博客專欄

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

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

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

          在 Pandas 中,merge_ordered 是一種用于合并有序數(shù)據(jù)的函數(shù)。它類似于 merge 函數(shù),但適用于處理時間序列數(shù)據(jù)或其他有序數(shù)據(jù)。merge_ordered 在合并時會保留原始數(shù)據(jù)的順序,并且支持對缺失值進行處理。


           pd.merge_ordered(customer, order)


          默認情況下,merge_ordered將執(zhí)行Outer Join并根據(jù)連接鍵對數(shù)據(jù)進行排序。我們也可以像更改合并類型一樣調(diào)整how參數(shù)。

          merge_ordered是為有序數(shù)據(jù)(如時間序列)開發(fā)的。所以我們創(chuàng)建另一個名為Delivery的數(shù)據(jù)集來模擬時間序列數(shù)據(jù)合并。











           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],                      'delivery_country' : ['German', 'Indonesia', 'Armenia', 'Singapore', 'Japan']                      })
           delivery = pd.DataFrame({'delivery_date': ['2014-07-06', '2014-07-08', '2014-07-09', '2014-07-10'],                        'product': ['Apple', 'Apple', 'Orange', 'Orange']})


          讓我們假設delivery_date是投遞時間,它包含與Order數(shù)據(jù)集中的order_date一起使用。另外就是我們還需要將日期列轉(zhuǎn)換為datetime對象。

           order['order_date'] = pd.to_datetime(order['order_date'])  delivery['delivery_date'] = pd.to_datetime(delivery['delivery_date'])


          讓我們嘗試按日期列合并兩個數(shù)據(jù)集。

           pd.merge_ordered(order, delivery,  left_on = 'order_date', right_on = 'delivery_date')

          圖片

          合并的DataFrame是按連接鍵排序的Order和Delivery數(shù)據(jù)集的Outer Join結(jié)果。

          由于是外連接,一些數(shù)據(jù)點是空的。對于merge_ordered,有一個選項可以通過使用fill_method參數(shù)來填充缺失的值。

           pd.merge_ordered(order, delivery, left_on = 'order_date',  right_on = 'delivery_date', fill_method = 'ffill' )

          圖片

          在上面的DataFrame中執(zhí)行前向填充方法來計算缺失的值。

          最后merge_ordered函數(shù)還可以基于數(shù)據(jù)集列執(zhí)行DataFrame分組,并將它們一塊一塊地合并到另一個數(shù)據(jù)集。

           pd.merge_ordered(order, delivery, left_on = 'order_date',  right_on = 'delivery_date', right_by = 'product')

          圖片


          在上面的代碼中將product列傳遞給right_by參數(shù),這樣product列中的每個值都映射到每個可用行,并且用于對數(shù)據(jù)進行分組的同一DataFrame中不存在的數(shù)據(jù)用NaN填充。

          為了進一步理解,我們在合并之前添加日期來對數(shù)據(jù)進行分組。

           pd.merge_ordered(order, delivery, left_on = 'order_date',  right_on = 'delivery_date', right_by = ['delivery_date','product'])

          圖片

          在上面的合并過程中,我們最終得到了4個不同的組:

           ['2014–07–06', 'Apple'], ['2014–07–08', 'Apple'], ['2014–07–09', 'Orange'], ['2014–07–10', 'Orange']

          該組基于所使用列中的現(xiàn)有行,因此它不是所有惟一值的組合。例如,沒有[' 2014-07-09 ','Apple']組,因為此數(shù)據(jù)不存在。

          在上面的DataFrame中可以看到Order數(shù)據(jù)集中的每一行都映射到Delivery數(shù)據(jù)集中的組。

          merge_asof

          merge_asof 是一種用于按照最近的關鍵列值合并兩個數(shù)據(jù)集的函數(shù)。這個函數(shù)用于處理時間序列數(shù)據(jù)或其他有序數(shù)據(jù),并且可以根據(jù)指定的列或索引按照最接近的值進行合并。

           order = pd.DataFrame({'order_id': [199, 200, 201,202,203,204],                      'cust_id':[1,1,3,3,4,2],                      'order_date': ['2014-07-01', '2014-07-05', '2014-07-06', '2014-07-07', '2014-07-07', '2014-07-08'],                      'order_value': [11, 10.1, 20.5, 18.7, 19.1, 13.5],                      'delivery_country' : ['Poland', 'German', 'Indonesia', 'Armenia', 'Singapore', 'Japan']                      })  delivery = pd.DataFrame({'delivery_date': ['2014-07-06', '2014-07-08', '2014-07-09', '2014-07-10'],                        'product': ['Apple', 'Apple', 'Orange', 'Orange']})

          使用merge_asof函數(shù)的一個注意事項是,必須按鍵對兩個DataFrame進行排序。這是因為它將根據(jù)鍵的距離合并鍵,而未排序的DataFrame將拋出錯誤消息。

          使用merge_asof類似于其他的合并操作,需要傳遞想要合并的DataFrame及其鍵名稱。

           pd.merge_asof(order, delivery, left_on = 'order_date',  right_on = 'delivery_date')

          圖片

          我們可以看到一些數(shù)據(jù)被合并了,但不是精確的值匹配。比如在第三行和第四行,order_date值為“2014-07-07”,但delivery_date為“2014-07-06”。

          使用merge_asof會丟失數(shù)據(jù)。默認情況下它查找最接近匹配的已排序的鍵。在上面的代碼中,與delivery_date不完全匹配的order_date試圖在delivery_date列中找到與order_date值較小或相等的鍵。

          delivery_date中小于等于order_date' 2014-07-07 '的值為' 2014-07-06 '。這就是為什么合并發(fā)生在這個鍵上。而order_date ' 2017-04-01 '和' 2017-04-05 '根本沒有匹配,因為在delivery_date中沒有小于或等于它們的值的值。

          如果在正確的DataFrame中有多個重復的鍵,則只有最后一行用于合并過程。例如將更改delivery_date數(shù)據(jù),使其具有多個不同產(chǎn)品的“2014-07-06”值。


           delivery = pd.DataFrame({'delivery_date': ['2014-07-06', '2014-07-06', '2014-07-08', '2014-07-10'],                        'product': ['Apple', 'Orange', 'Apple', 'Orange']})

          圖片

          然后我們將執(zhí)行與之前相同的合并過程。

           pd.merge_asof(order, delivery, left_on = 'order_date',  right_on = 'delivery_date')

          圖片

          可以看到,合并過程對Orange產(chǎn)品而不是Apple產(chǎn)品使用delivery_date ,盡管兩者具有相同的鍵值。另外具有精確匹配的鍵也會受到影響,它們會選擇最后一行鍵。

          可以通過設置allow_exact_matches=False來關閉精確匹配合并。

           pd.merge_asof(order, delivery, left_on = 'order_date',  right_on = 'delivery_date', allow_exact_matches = False)

          圖片

          通過使用direction 參數(shù)來改變查找鍵的策略。例如使用向前策略:

           pd.merge_asof(order, delivery, left_on = 'order_date',  right_on = 'delivery_date', direction = 'forward')

          圖片


          向前策略與向后策略類似,不同之處在于該函數(shù)將通過查看大于或等于正確DataFrame鍵的值來嘗試合并。

          另一個可以使用的策略是就近策略。在這個策略中使用向后或向前策略;取絕對距離中最近的那個。如果有多個最接近的鍵或精確匹配,則使用向后策略。

           pd.merge_asof(order, delivery, left_on = 'order_date',   right_on = 'delivery_date', direction = 'nearest')

          圖片

          最后還可以通過使用tolerance 參數(shù)來控制鍵之間的距離。

           pd.merge_asof(order, delivery, left_on = 'order_date',  right_on = 'delivery_date', direction = 'forward',   tolerance = pd.Timedelta(1, 'd'))

          圖片

          在上面的示例中,只有第一行包含缺失值。這是因為order_date第一行與最近的日期delivery_date之間的距離大于一天。第二行成功合并,因為只差一天。

          總結(jié)

          Pandas函數(shù)提供了Merge函數(shù)可以輕松的幫助我們合并數(shù)據(jù),而merge_ordered函數(shù)和merge_asof可以幫助我們進行更加定制化的合并工作,雖然這兩個函數(shù)可能并不常見,但是它們的確在一些特殊的需求上非常的好用。

          作者:Cornellius Yudha Wijaya


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



          關鍵詞: AI

          相關推薦

          技術專區(qū)

          關閉