Pandas用的6不6,來試試這道題就能看出來

2021-10-14 06:26:06 字數 1781 閱讀 1366

題目描述:給定一組使用者的多次行為起止時間表,由於相鄰行為之間可能存在交叉(即後一行為的開始時間可能早於前一行為的結束時間),所以需根據使用者id對其相應的起止時間資訊進行合併處理。不失一般性,模擬示例資料如下:

在上述示例資料中,使用者a和使用者b的多組行為間,均存在一定的起止時間交叉,例如使用者a的兩個行為起止時間分別為[3, 6]和[4, 7](同時,這裡的兩組行為開始時間先後順序還是錯的),存在交叉,所以可合併為[3, 7];類似地,使用者b的兩個行為起止時間分別為[4, 7]和[6, 8],也可合併為[4, 8]。

為完成以上這一小需求,實際上可拆解為兩個小問題:

源自leetcode56題截圖

首先,第乙個小問題難度不大,直接實現乙個自定義函式即可,示例**如下,其中函式功能正常執行的前提是starts已按照從小到大的順序完成排序,當然這一細節在pandas中很容易實現。

1def range_combine(starts, ends):

2    # 在starts有序的前提下,完成區間合併

3    combines = 

4    for start, end in zip(starts, ends):

5        if not combines or start > combines[-1][1]:

7        else:

8            combines[-1][1] = max(combines[-1][1], end)

9    return combines

10# 測試樣例

11starts = [1, 3, 4, 8]

12ends = [2, 6, 7, 9]

13range_combine(starts, ends)

14# 輸出 [[1, 2], [3, 7], [8, 9]]

為了實現第二個小功能,則需要一定的技巧實現。可以肯定的是,為了實現按使用者分組進行區間合併,那麼肯定要groupby('uid'),而後對每個grouper執行range_combine,得到各使用者及其合併後的所有區間巢狀列表,進而問題轉化為如何將這個巢狀列表再拆分為多行。這就涉及到pandas中的乙個有用的api——explode,即將乙個序列**成多行,從如下的explode函式說明文件中可以看出,它接收乙個或多個列名作為引數(即要拆分的列),當該列的取值是乙個列表型的元素時,可以將其拆分,並將該行中其餘元素複製多份,從而實現拆分的過程。

進而,可以完成各使用者多個行為起止區間**成多行的過程,具體實現如下:

至此,已經完成了大部分功能實現,僅差最後一步,即將各使用者的歷次合併後的行為起止時間拆分為兩列,分別表示開始和結束時間,這一過程可直接呼叫pd.series實現重新命名即可。最後給出這個需求的pandas一句**完整實現過程:

乙個現實需求,對應多個資料處理小技巧,這真是實踐出真知啊!

pandas提取資料的6種方法

pandas是python資料分析必備工具,它有強大的資料清洗能力,往往能用非常少的 實現較複雜的資料處理。import pandas as pd data pd.read excel 超市運營資料模板.xlsx 第一種方法,用比較運算子 data data.性別 男 第二種方法,用比較函式 eq ...

劍指offer 6,用棧來實現佇列(反之)

題目描述 用兩個棧來實現乙個佇列。有兩個棧,棧的特點是,元素先進後出,佇列的特點是,先進先出。所以進棧的那個不能用來出,得換乙個棧,得出,兩次先進後出後,就會得到進來時後得順序了。所以,當push 時 加入用棧1來進入資料 當pop 彈出資料時候,分情況了 如果此時棧2為空,就將所有的棧1中的元素壓...

基礎演算法 6 不基於比較的排序

o n 不基於比較的排序演算法 在接下來的幻燈片,我們將討論兩種不基於比較的排序演算法 計數排序和基數排序。這些排序演算法可以通過不比較陣列的專案來比時間複雜度為 n log n 的基於比較的排序演算法的下限更快。排序演算法的下限 我們都知道 在這個視覺化中也沒有證明,因為它需要花費乙個小時的講座來...