2017-05-16 17 views
0

私は、人が私たちのサービスのために申し込んだ最後の2回の間に時間の差をつけようとしています。私のソリューションは機能しますが、それは醜いです。同じ列のDatediff

これを達成するためのより良い方法がありますか?あなたが唯一の最後の要素のリストを持って、その後[0]とインデックスで、それを抽出するアプリケーションの日付のすべての違いは、その後[-1:]でそれをスライス計算リストの内包を持つ

for customer in previous_apps: 
    app_times = df.ix[df['customer_id']==customer, 'hit_datetime'] 
    days_since_last_app = [(b-a).days for a,b in zip(app_times, app_times[1:])][-1:][0] 
    df.ix[df['customer_id']==customer, 'days_since_last_app'] = days_since_last_app 
+2

は、あなたの入力データフレームのサンプルを表示することができますか? –

答えて

1

は全く不要です。

あなただけの最後の出願日app_times[-1]と第二の最後の1 app_times[-2]をとり、その差とることができます。

リストで少ないし、2つのエントリがある場合、あなたはおそらく特別にしたいので、これは失敗しますがその場合。

(私はそのラインを推測しているが、それは以前のエントリを持っていないの結果であったIndexError Sを解決しようとすることであるものへと進化。)

+0

ああ...ありがとう。私よりずっと良い! – fcol

0

私は正確にどのようにあなたのデータを理解していませんあなたが必要とする機能を提供する必要があります:

df.sort_values(['customer_id','hit_datetime'],ascending=True,inplace=True) 
df['days_since_last_app'] = df.groupby('customer_id')['hit_datetime'].transform(lambda y: y.diff().apply(lambda x: 0 if x!=x else x.days)) 
1

まず、あなたの時間差を計算する2つの引数の関数を定義します。 time_diff(a, b)

df["last_visit"] = df.groupby("customer_id").apply(
     lambda x: x.apply(time_diff(*x["hit_datetime"][-2:])) 

hit_datetimeの値は、あなたのコードは、彼らが暗示され、ソートされていると仮定。)

上記の「放送」last_visit値は、複数のレコードが同じcustomer_idを持っているので、このような何か、それを使用します。あなたはただ、顧客ごとに1つの行とSeriesとして結果を保存することができ好む場合:

last_visit = df.groupby("customer_id").apply(
     lambda x: x.apply(time_diff(*x["hit_datetime"][-2:]))