2017-12-16 6 views
2

複数の顧客からの複数の請求書を含むpandas.DataFrameがあります。 私は2つの請求書の間の時間を顧客に応じて計算するエレガントな方法を探したいと思っています。複数の請求書のインデックス、時差の取得方法 - パンダ

  CustomerID   InvoiceDate time between 2 orders 
index         
536365  17850.0 2010-12-01 08:26:00 0 minutes (or np.nat) 
536366  17850.0 2010-12-01 08:28:00 2 minutes 
536367  13047.0 2010-12-01 08:34:00 0 minutes (It's a new customer) 
536369  13047.0 2010-12-01 08:35:00 1 minute 
536371  13748.0 2010-12-01 09:00:00 0 minute (new customer) 
536372  17850.0 2010-12-01 09:01:00 33 minutes (see line #2) 
536373  17850.0 2010-12-01 09:02:00 1 minute 
536374  15100.0 2010-12-01 09:09:00 0 minute 

これは私がこれまでに見つかったものです(ただし、明らかにそれは動作しません:次のように

マイデータフレームが見えます(インデックスは送り状Noで、最後の列は、私が期待していものです) !)

df = df.sort_values(['CustomerID', 'InvoiceDate']) #To order first according 
df = df.set_index('index', drop = True) 
for CustomerID in df['CustomerID'].unique(): 
    index = df.set_index('CustomerID').index.get_loc(CustomerID) 
    df['Ordersep'].iloc[index] = df['InvoiceDate'].iloc[index].diff() 

私を助けるアイデアはありますか?これは動作するはず

答えて

2

あなたはdiff()groupby()を使用することができます。

df.InvoiceDate = pd.to_datetime(df.InvoiceDate) 
df["timedelta"] = df.groupby(["CustomerID"]).InvoiceDate.apply(lambda x: x.diff()) 

df 
    index CustomerID   InvoiceDate timedelta 
0 536365  17850.0 2010-12-01 08:26:00   NaT 
1 536366  17850.0 2010-12-01 08:28:00  00:02:00 
2 536367  13047.0 2010-12-01 08:34:00   NaT 
3 536369  13047.0 2010-12-01 08:35:00  00:01:00 
4 536371  13748.0 2010-12-01 09:00:00   NaT 
5 536372  17850.0 2010-12-01 09:01:00  00:33:00 
6 536373  17850.0 2010-12-01 09:02:00  00:01:00 
7 536374  15100.0 2010-12-01 09:09:00   NaT 
+0

ビンゴを!解決策が見えたら、それは常に明らかです。 –

0

が、これは何

for customer_id in df.CustomerId.unique(): 
    matching_customer_mask = df.CustomerId == customer_id 
    customer_df = df[matching_customer_mask] 

    order_times = customer_df.InvoiceDate 
    prev_order_times = customer_df.InvoiceDate.shift(1) 

    df.loc[matching_customer_mask, 'Ordersep'] = order_times - prev_order_times 

(おそらく少しひねると)あなたはこの前に顧客IDと請求書の日付でソートしていると仮定して、それが1つのステップダウン請求書の日付列をシフトしていますあなたが望む違いを計算します。

関連する問題