2017-02-15 5 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'でone-linerを拡張しました。これはうまくいけば何が起こっているのかをより明確にするはずです。私がもっと精緻化する必要があるかどうかを教えてください。 –

+1

インデックス作成構文は 'rows.loc [row_labels、column_labels]'です。ここではブール値マスクを 'row_labels'、' 'time''を' column_labels'として使用しています。基本的に行のサブセットと単一の列を選択します。 –

関連する問題