Рассмотрим фрейм данных tests
отдельных тестов в некоторых скважинах:
borehole depthTest
0 B-1 1.5
1 B-1 20.0
2 B-42 1.0
3 B-42 2.0
4 B-42 15.0
5 B-42 30.0
6 B-09 1.0
7 B-09 10.0
8 B-09 15.0
У меня есть еще один кадр данных, liths
, с диапазонами литологий каждой скважины:
borehole depthTop lith
0 B-1 0 sand
1 B-1 5 clay
2 B-1 18 shale
3 B-42 0 sand
4 B-42 1 clay
5 B-42 26 shale
6 B-09 0 sand
7 B-09 12 shale
Литология представляет собой непрерывную последовательность для каждой скважины. Например: в B-1 есть песок с глубины от 0 до 5 м, глина от 5 до 18 м и сланец с 18 м и далее. Основание каждой литологии - это начало следующего. Другими словами, дно каждой литологии будет liths.groupby('borehole').depthTop.shift(-1)
Редактировать: Я хочу присоединиться к двум ДФ, чтобы я мог получить литологию каждого теста: я хочу сопоставить borehole
, а затем найти lith
, который имеет ближайший depthTop
<= <code>depthTest.
Например: в B-42 есть глина с глубины от 1 м до 26 м. Испытание в B-42 на 15,0 м должно быть классифицировано как глина, потому что 15 между 1 и 26.
Вот желаемый результат:
borehole depthTest lith
0 B-1 1.5 sand
1 B-1 20.0 shale
2 B-42 1.0 clay
3 B-42 2.0 clay
4 B-42 15.0 clay
5 B-42 30.0 shale
6 B-09 1.0 sand
7 B-09 10.0 sand
8 B-09 15.0 shale
Это похоже на groupby
и merge_asof
проблему, но я не могу понять, как их собрать.
Мое решение, которое работает до сих пор, состоит в том, чтобы выгрузить это в sqlite3
и затем выполнить between
соединение (как я сделал здесь ), но это действительно похоже на поражение.