2017-02-15 140 views
3

我有一個大約350k行和12列點擊流數據的數據框。下面是數據看起來像一個簡單的片段。對於每個設備,我希望返回購買時間之後出現的所有行。Python - 在滿足條件的特定日期後返回行

type_ deviceid campaign_   time 
    Click device_1 Campaign_1 11/16/16 14:07 
Purchase device_1 Campaign_6 11/18/16 16:26 
    Click device_1 Campaign_5 11/19/16 14:17 
    Click device_1 Campaign_1 11/19/16 14:30 
    Click device_2 Campaign_4 11/6/16 7:00 
Purchase device_2 Campaign_2 11/9/16 21:56 
    Click device_2 Campaign_2 11/10/16 5:17 
    Click device_2 Campaign_3 11/12/16 19:19 

我使用.loc拉我需要的結果試過,但無濟於事。任何人都可以指引我正確的方向,或讓我知道我需要做什麼?

+0

是購買時間列?你可以發佈df.head()來查看所有的列嗎? – Vaishali

+0

購買時間不是專欄。其他專欄與手邊的問題無關。其他列是源,中,訂單值,訂單號.. –

回答

2

首先,定義一個函數來過濾每個組中的行,例如,

def after_purchase(rows): 
    # boolean mask indicating rows which are purchases 
    is_purchase = rows.type_ == 'Purchase' 

    # select timestamps from all purchases 
    purchase_times = rows.loc[is_purchase, 'time'] 

    # grab the first (earliest) purchase timestamp 
    first_purchase_time = purchase_times.min() 

    # return all rows which occurred after the first purchase 
    return rows.loc[rows.time > first_purchase_time] 

然後,按照設備ID對數據幀進行分組,並將該功能應用到每個組。

df.groupby('deviceid').apply(after_purchase) 
  type_ deviceid campaign_    time 
deviceid             
device_1 2 Click device_1 Campaign_5 2016-11-19 14:17:00 
     3 Click device_1 Campaign_1 2016-11-19 14:30:00 
device_2 6 Click device_2 Campaign_2 2016-11-10 05:17:00 
     7 Click device_2 Campaign_3 2016-11-12 19:19:00 
+0

太棒了!它似乎已經奏效了,但是你能解釋一下這部分嗎? 'purchase_time = rows.loc [rows ['type_'] =='Purchase','time _']。iloc [0]' 其拉動值其中'type_'是'Purchase',但是什麼是' time_'參考?我也不確定最後的'.iloc [0]'在做什麼。非常感謝你! –

+1

@Christopher請參閱我的編輯。我已經擴大了'after_purchase'中的單線,希望能夠更清楚地說明發生了什麼。如果我需要詳細說明,請告訴我。 –

+1

索引語法是'rows.loc [row_labels,column_labels]''我在那裏使用了布爾掩碼作爲'row_labels',''time''作爲'column_labels'。基本上選擇一個行和一個列的子集。 –

相關問題