2015-06-10 2 views
1

Я новичок в Python и панд и может реально использовать некоторую помощь на этом ..Pandas/Python: Как совместить строки из двух фреймов данных на основе близких, но не равных значений?

Background- Я пытаюсь извлечь unsynchronised измерения двойного допплер от сканирования LiDAR, который принимает PPI ​​сканирования. У меня есть данные (из MySQL), загружаемые в dataframes pandas, и теперь вам нужно применить некоторую функцию соответствия, где строки сопоставляются, если время измерения находится в пределах некоторого предела (время < 8 с.).

Вот пример того, что содержится в dataframes: https://gist.github.com/anonymous/b0cc61b461c9e2d8f7bf

Колонка dt_stop (от LabView) измеряется в секундах и то, что я хочу, чтобы соответствовать на основе.
Итак, в этом примере строка 0 из df1 не будет соответствовать, так как между ней и любой строкой содержится df2.
Строка 1 из df1 будет соответствовать ряду 0 из df2, так как они находятся всего на 0,5 секунды друг от друга.
Я хотел бы, чтобы все совпадения были объединены по горизонтали, чтобы я мог выполнять мои вычисления по одной и той же строке.

Надеюсь, это имеет смысл. Любая помощь очень ценится!

Вот мой текущий код: https://gist.github.com/anonymous/6dee303f4f8260600fdd

+0

Это похоже на условие «join», которое намного лучше выражено в базе данных до загрузки в Pandas. Если у вас есть это в MySQL, просто выполните соединение, основанное на условии, которое вы хотите напрямую, например 'select * from table1, join table2 b на ABS (a.dt_stop - b.dt_stop) <= 8' - или используйте причудливое datetime функционирует по мере необходимости. После этого поворот в так называемом многократном совпадении станет проще в Pandas. – ely

+0

Эй, спасибо за предложение! Я попытался сделать это в начале, но не смог заставить его работать правильно. Это два запроса, которые я использую для получения данных для каждого сканера. Все это хранится на 4 отдельных таблицах. https://gist.github.com/anonymous/360e1adb94332c4e627e – Elliot

+0

Спасибо Господин F! Я понял это и разместил решение SQL ниже. – Elliot

ответ

0

Я принял совет г-F и решить ее внутри запроса.

Вот что я сделал для справок в будущем .. надеюсь, что это поможет кому-то!

SELECT wk.gw_id, wk.scn_id, wk.dt_start, wk.dt_stop, wk.azim, wkdat.radSpeed, wkdat.cnr, wkdat.disp, 
wst.gw_id, wst.scn_id, wst.dt_start, wst.dt_stop, wst.azim, wstdat.radSpeed, wstdat.cnr, wstdat.disp 
FROM wisscas.wind_def_koshava wk 
inner join wisscas.wind_def_sterenn wst on (abs(wk.dt_stop-wst.dt_stop)<2.0 and abs(wk.dt_start-wst.dt_start)<2.0) 
inner join wisscas.wind_data_koshava wkdat on (wk.gw_id = wkdat.gw_id) 
inner join wisscas.wind_data_sterenn wstdat on (wst.gw_id = wstdat.gw_id) 
where wk.scn_id = 177 
and wk.azim between 2 and 3 
and wkdat.dist = 6160 
and wst.scn_id = 252 
and wst.azim between 262 and 263 
and wstdat.dist = 2480 
limit 0,5000; 
Смежные вопросы