2016-11-16 4 views
3

私は2つのデータフレームを持っています.1つは顧客へのコール、もう1つはクライアントによるアクティブなサービス継続時間の識別です。各クライアントは複数のサービスを持つことができますが、重複することはありません。パンダのマージカラム日付間

df_calls = pd.DataFrame([['A','2016-02-03',1],['A','2016-05-11',2],['A','2016-10-01',3],['A','2016-11-02',4], 
         ['B','2016-01-10',5],['B','2016-04-25',6]], columns = ['cust_id','call_date','call_id']) 

print df_calls 

    cust_id call_date call_id 
0  A 2016-02-03  1 
1  A 2016-05-11  2 
2  A 2016-10-01  3 
3  A 2016-11-02  4 
4  B 2016-01-10  5 
5  B 2016-04-25  6 

df_active = pd.DataFrame([['A','2016-01-10','2016-03-15',1],['A','2016-09-10','2016-11-15',2], 
          ['B','2016-01-02','2016-03-17',3]], columns = ['cust_id','service_start','service_end','service_id']) 


print df_active 

    cust_id service_start service_end service_id 
0  A 2016-01-10 2016-03-15   1 
1  A 2016-09-10 2016-11-15   2 
2  B 2016-01-02 2016-03-17   3 

私は、それぞれの呼び出しは、SERVICE_STARTとservice_end日付で識別するために属しているのservice_idを見つける必要があります。日付の間にコールがない場合、コールはデータセットに残る必要があります。ここで

は、私がこれまで試したものです:

df_test_output = pd.merge(df_calls,df_active, how = 'left',on = ['cust_id']) 
df_test_output = df_test_output[(df_test_output['call_date']>= df_test_output['service_start']) 
         & (df_test_output['call_date']<= df_test_output['service_end'])].drop(['service_start','service_end'],axis = 1) 

print df_test_output 

    cust_id call_date call_id service_id 
0  A 2016-02-03  1   1 
5  A 2016-10-01  3   2 
7  A 2016-11-02  4   2 
8  B 2016-01-10  5   3 

これは、サービスの日付の間にありませんでしたすべてのコールがドロップされます。どの基準を満たすservice_idをどのようにマージできますか?残りのレコードは保持していますか?

結果は次のようになります。

#do black magic 

print df_calls 

cust_id call_date call_id service_id 
0  A 2016-02-03  1   1.0 
1  A 2016-05-11  2   NaN 
2  A 2016-10-01  3   2.0 
3  A 2016-11-02  4   2.0 
4  B 2016-01-10  5   3.0 
5  B 2016-04-25  6   NaN 
+1

あなたは 'call_id' –

答えて

3

あなたが左にmergeを使用することができます参加:

print (pd.merge(df_calls, df_calls2, how='left')) 
    cust_id call_date call_id service_id 
0  A 2016-02-03  1   1.0 
1  A 2016-05-11  2   NaN 
2  A 2016-10-01  3   2.0 
3  A 2016-11-02  4   2.0 
4  B 2016-01-10  5   3.0 
5  B 2016-04-25  6   NaN 
+0

df_calls2のISN」に関する' df_calls'で 'df_calls2'に参加することができ本当のテーブル。それは、df_callsとdf_serviceをマージして、それからdupesを削除した結果です。私が試した方法がうまくいかないことを示すために作成されたものです。 – flyingmeatball

+0

ええと、それは動作すると思うが、より良い解決策を見つける? – jezrael

+0

ああちゃん - あなたが言っていることを見て、それはうまくいく、ありがとう!私はグラフを使って探索していました。https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.sparse.csgraph.connected_components.html – flyingmeatball

関連する問題