Найти диапазон, в который попадает точка? - PullRequest
0 голосов
/ 09 мая 2018

Рассмотрим фрейм данных 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 соединение (как я сделал здесь ), но это действительно похоже на поражение.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Давайте попробуем это:

tests['lith'] = tests.groupby('borehole')['depthTest'].transform(lambda x: pd.cut(x,
       bins = liths.loc[liths.borehole == x.name,'depthTop'].values.tolist() + [np.inf],
       labels=liths.loc[liths.borehole == x.name,'lith'], right=False))

Выход:

  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

Давайте использовать pd.cut для обозначения значений в диапазоне.
И используя groupby, чтобы получить соответствующие bins и labels для pd.cut из кадра данных литров по скважине.

0 голосов
/ 09 мая 2018

Найдите ближайшее значение на df2 и распределите по категориям:

def logic(k):
    vals = df2.loc[df2.borehole == k.borehole,:]
    return vals[vals.depthTop == max(vals[vals.depthTop <= k.depthTest].depthTop)].lith.item()

df.transform(logic, 1)


0     sand
1    shale
2     clay
3     clay
4     clay
5    shale
6     sand
7     sand
8    shale
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...