2016-10-24 2 views
-2

Wie Zeilen mit Plr_Date am nächsten zu Mtc_Date auswählen? Vorzugsweise ohne Schleife über jede Zeile. Ich möchte mit Zeilen 13, 28, 43 enden.Wählen Sie das nächste Datum (oder Wert) in Pandas/Python

Ich sollte klarstellen: aus der Reihe von Zeilen mit demselben mtc_date wählen Sie eine Zeile mit dem nächsten plr_date.

 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 

Ich mag würde Code hinzufügen zu reproduzieren, sondern „Es sieht aus wie Sie Ihre Post meist Code ist ...“,

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 

Antwort

0

Basierend auf Ihren Kommentar, hier ist die aktualisierte Lösung groupby verwenden.

Suchen Sie für jede Gruppe mit demselben mtc_date den Index, der die absolute Differenz (in Tagen) zwischen mtc_date und plr_date minimiert.

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

soll ich klarstellen: aus der Gruppe von Zeilen mit dem gleichen mtc_date wählen Sie eine Zeile mit engstenem plr_date. – klubow

+0

Ihre Antwort funktioniert gut für dieses spezielle Beispiel, nur so funktioniert die Sortierung nach diff_dates hier – klubow

+0

für 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)}) es funktioniert nicht – klubow

Verwandte Themen