2017-01-25 4 views
3

ich folgendes bin mit einem links zu tun, kommen in Pandas:links mit etwa gleichen numerischen Vergleich in Pandas kommen

merged_left = pd.merge(left=xrf_df, 
         right=statistics_and_notes_df, 
         how='left', 
         left_on=depth_column_name, 
         right_on='Core Depth') 

jedoch die depth_column_name und ‚Core-Tiefe‘ Spalten Punktzahlen schweben. Gibt es eine gute Möglichkeit, diese linke Verknüpfung so zu machen, dass der Vergleich ungefähr gleich ist wie np.isclose()?

+2

Diese Funktion wird ab sofort in der nächsten Version (0.20.0) mit [merge_asof'] verfügbar sein (https://pandas-docs.github.io/pandas-docs-travis/generated/ pandas.merge_asof.html) mit dem Parameter 'direction = 'nearest'' (kann mit dem Parameter' tolerance' eingeschränkt werden). Bis dahin wird wahrscheinlich eine benutzerdefinierte Codierung erforderlich sein. – root

+0

Leider ist der Toleranzparameter in merge_asof eine ganze Zahl oder TimeDelta. Ich würde einen Schwimmer wie 0,003 benötigen. – user90855

Antwort

2

Angenommen, wir folgende Verschlechterungsfaktoren haben:

In [111]: a 
Out[111]: 
     a b c 
0 3.03 c 3 
1 1.01 a 1 
2 2.02 b 2 

In [112]: b 
Out[112]: 
     a x 
0 1.02 Z 
1 5.00 Y 
2 3.04 X 

Lassen Sie uns float64 Spalte als Index Beitritt festgelegt (sortiert):

In [113]: a = a.sort_values('a').set_index('a') 

In [114]: b = b.assign(idx=b['a']).set_index('idx').sort_index() 

In [115]: a 
Out[115]: 
     b c 
a 
1.01 a 1 
2.02 b 2 
3.03 c 3 

In [116]: b 
Out[116]: 
     a x 
idx 
1.02 1.02 Z 
3.04 3.04 X 
5.00 5.00 Y 

wir jetzt DataFrame.reindex(..., method='nearest') verwenden können:

In [118]: a.join(b.reindex(a.index, method='nearest'), how='left') 
Out[118]: 
     b c  a x 
a 
1.01 a 1 1.02 Z 
2.02 b 2 1.02 Z 
3.03 c 3 3.04 X 

In [119]: a.join(b.reindex(a.index, method='nearest'), how='left').rename(columns={'a':'a_right'}) 
Out[119]: 
     b c a_right x 
a 
1.01 a 1  1.02 Z 
2.02 b 2  1.02 Z 
3.03 c 3  3.04 X 

In [120]: a.join(b.reindex(a.index, method='nearest'), how='left').rename(columns={'a':'a_right'}).reset_index() 
Out[120]: 
     a b c a_right x 
0 1.01 a 1  1.02 Z 
1 2.02 b 2  1.02 Z 
2 3.03 c 3  3.04 X 

PS Sie können den Parameter df.reindex(..., tolerance=<value>) verwenden, um die Toleranz festzulegen: abs(index[indexer] - target) <= tolerance

+1

Das funktioniert perfekt, wenn ich das Toleranzschlüsselwort zum Neuindex hinzufügen. – user90855

+0

@ user90855, froh, ich könnte helfen :) – MaxU

Verwandte Themen