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
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
Leider ist der Toleranzparameter in merge_asof eine ganze Zahl oder TimeDelta. Ich würde einen Schwimmer wie 0,003 benötigen. – user90855