2016-10-24 148 views
-2

plt_dateがmtc_dateに最も近い行を選択するにはどうすればいいですか? 好ましくは各行をループしないでください。 私は行13、28、43で終わりたいと思います。pandas/pythonで最も近い日付(または値)を選択

私は明確にする必要があります:同じmtc_dateを持つ行のセットから最も近いplr_dateを持つ行を1つ選択してください。

 mtc_date mtc_id plr_date plr_id plr_measure 
12 2010-03-15  1 2010-01-31  1   0 
13 2010-03-15  1 2010-02-28  1   1 
24 2010-06-15  2 2010-01-31  2   12 
25 2010-06-15  2 2010-02-28  2   13 
26 2010-06-15  2 2010-03-31  2   14 
27 2010-06-15  2 2010-04-30  2   15 
28 2010-06-15  2 2010-05-31  2   16 
36 2010-09-15  2 2010-01-31  2   12 
37 2010-09-15  2 2010-02-28  2   13 
38 2010-09-15  2 2010-03-31  2   14 
39 2010-09-15  2 2010-04-30  2   15 
40 2010-09-15  2 2010-05-31  2   16 
41 2010-09-15  2 2010-06-30  2   17 
42 2010-09-15  2 2010-07-31  2   18 
43 2010-09-15  2 2010-08-31  2   19 

私は、「...あなたの投稿は、ほとんどのコードであるように見えます」あなたのコメントに基づいて

import pandas as pd 
import numpy as np 


### 1 df 
plr = pd.concat(\ 
[pd.DataFrame({'plr_date': pd.date_range("01/01/2010", "12/31/2010", freq="m"),\ 
'plr_id': 1 , 'plr_measure': 10}),\ 
pd.DataFrame({'plr_date': pd.date_range("01/01/2010", "12/31/2010", freq="m"),\ 
'plr_id': 2 , 'plr_measure': 20})]) 

#plr = plr.reindex(index=range(0, plr.shape[0]), columns=None, fill_value=0)  

plr['plr_measure']=np.arange(0, plr.shape[0]) 


### 2 df 
mtc = pd.DataFrame({'mtc_date':pd.to_datetime(['15/01/2010','15/03/2010','15/06/2010','15/09/2010']),\ 
        'mtc_id':(1,1,2,2)}) 

mtc = mtc.merge(plr, left_on='mtc_id', right_on='plr_id', how='left') 



#select only smaller 
mtc = mtc[(mtc.plr_date < mtc.mtc_date)] 

#leave the bigest 

答えて

0

を再現するためにコードを追加したいだろうが、ここではGROUPBYを使用して更新のソリューションです。

同じmtc_dateを持つグループごとに、mtc_dateとplr_dateの絶対差(日数)を最小限にするインデックスを見つけます。

min_indexes = mtc.groupby('mtc_date').apply(lambda x: (x['plr_date'] - x['mtc_date']).apply(lambda y: int(y.days)).abs().argmin()) 

enter image description here

+0

Iは、明確にすべきである:同じmtc_date持つ行のセットから最も近いplr_dateと一列を選択します。 – klubow

+0

あなたの答えはこの特定の例でうまくいきます。ちょうど、diff_datesによる並べ替えがここで働いています – klubow

+0

mtc = pd.DataFrame({'mtc_date':pd.to_datetime(['01/03/2010'、 '29/03/2010年、28/03/2010、15/09/2010]]、 'mtc_id' :(1,1,2,2)})うまくいきません。 – klubow

関連する問題