2017-11-15 1 views
0

I df1 mit einigen Variablen, da für bestimmte Werte A einen Datenrahmen haben:Halten Sie nur Datenrahmen Zeilen am nächsten Werte gegeben

df1 = pd.DataFrame({"A": [110.035,110.078,110.732,112.828,112.930], 
       "var1": np.random.random(5), 
       "var2":np.random.random(5)}) 

     A   var1  var2 
0 110.035  0.500537 0.571497 
1 110.078  0.234550 0.732815 
2 110.732  0.337149 0.098250 
3 112.828  0.190261 0.366118 
4 112.930  0.990539 0.892640 

und einem Datenrahmen df2 von A-Werten wie

df2 = pd.DataFrame({"A": [110.04, 112.83]}) 

     A 
0 110.04 
1 112.83 

I Now Ich möchte alle Werte in df1 behalten, die einem der Werte in df2 am nächsten kommen und alle anderen löschen. In meinem Beispiel möchte ich nur die Zeilen 0 und 3 behalten.

Meine Idee ist es, die absoluten Differenzen und verwenden argsort() zu bauen:

(df1.A-x).abs().argsort()[:1] 

aber das funktioniert für einen Wert x nur, wie kann ich dies in df2 auf alle Werte verlängern?

+0

Was ist der Toleranzwert? –

+0

Spielt es eine Rolle? Ich brauche nur den nächsten, egal wie weit weg es ist. – datasailor

+0

..... Ähm, okay. –

Antwort

4

Verwendung reindex mit method='nearest':

df = df1.set_index('A').reindex(df2.A, method='nearest').reset_index() 
df 

     A  var1  var2 
0 110.04 0.262062 0.624065 
1 112.83 0.107757 0.167591 

Wenn Sie die ursprünglichen A Werte zurück wollen, einen zweiten merge Schritt mit df1 ausführen:

df.merge(df1, on=['var1', 'var2']).reindex(columns=df1.columns) 

     A  var1  var2 
0 110.035 0.262062 0.624065 
1 112.828 0.107757 0.167591 
+1

AH, ich habe das vergessen :-) – Wen

+0

Die Werte in der Spalte A in Ihrer Ausgabe stammen von' df2'. Aus der Frage scheint es, dass das OP die ursprünglichen Werte von 'df1 ['A']' behalten möchte. – root

+1

@Wen Ich versuchte merge_asof zuerst, aber konnte nicht scheinen, es zur Arbeit zu bringen .... dann erinnerte mich, dass dies existiert. –

3

Op1 numpy.searchsorted

Mit numpy.searchsorted dann mit Indexscheibe die df1

df1.loc[np.searchsorted(df1.A, df2.A)-1] 
Out[826]: 
     A  var1  var2 
0 110.035 0.007591 0.768843 
3 112.828 0.426480 0.902606 

Op2- merge_asof

pd.merge_asof(df2,df1,on='A',direction='nearest') 
Out[819]: 
     A  var1  var2 
0 110.04 0.007591 0.768843 
1 112.83 0.426480 0.902606 
Verwandte Themen