Изменение значений в двухиндексированном Dataframe на основе порога - PullRequest
0 голосов
/ 12 октября 2019

Итак, у меня очень большой набор данных, с которым я работаю, но я использую гораздо меньший набор данных в качестве шаблона для того, что мне нужно сделать. Предположим, у меня есть следующие 2 кадра данных:

import numpy as np
import pandas as pd
df = pd.DataFrame({
   'cond': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B','B', 'B', 'B', 'B', 'B','B','B'],
   'Array':  ['S', 'S', 'TT', 'TT','S', 'S', 'TT', 'TT','S', 'S', 'TT', 'TT','S', 'S', 'TT', 'TT','SS','TT'],
   'X':  [1, 2, 3, 1, 2 , 3, 4, 7.3, 5.1, 3.2, 1.4, 5.5, 9.9, 3.2, 1.1, 3.3, 1.2, 5.4],
   'Y':  [3.1, 2.2, 2.1, 1.2,  2.4, 1.2, 1.5, 1.33, 1.5, 1.6, 1.4, 1.3, 0.9, 0.78, 1.2, 4.0, 5.0, 6.0],
   'Marker':  [2.0, 1.2, 1.2, 2.01, 2.55, 2.05, 1.66, 3.2, 3.21, 3.04, 8.01, 9.1, 7.06, 8.1, 7.9, 5.12, 5.23, 5.15],
   'Area': [3.0, 2.0, 2.88, 1.33,  2.44, 1.25, 1.53, 1.0, 0.156, 2.0, 2.4, 6.3, 6.9, 9.78, 10.2, 15.0, 16.0, 19.0]
})
print(df)

df2 = pd.DataFrame({
   'cond': ['A', 'A', 'B', 'B', 'B'],
   'Array':  ['S', 'TT', 'S', 'SS','TT'],
   'cutoff1':  [2.55, 2.01, 7.06, 1, 8.01],
   'cutoff2':  [1.60, 2.2, 2.1, 1.2,  2.4]
})
print(df2)

Это дает следующие два набора:

   cond Array    X     Y  Marker    Area
0     A     S  1.0  3.10    2.00   3.000
1     A     S  2.0  2.20    1.20   2.000
2     A    TT  3.0  2.10    1.20   2.880
3     A    TT  1.0  1.20    2.01   1.330
4     A     S  2.0  2.40    2.55   2.440
5     A     S  3.0  1.20    2.05   1.250
6     A    TT  4.0  1.50    1.66   1.530
7     A    TT  7.3  1.33    3.20   1.000
8     A     S  5.1  1.50    3.21   0.156
9     B     S  3.2  1.60    3.04   2.000
10    B    TT  1.4  1.40    8.01   2.400
11    B    TT  5.5  1.30    9.10   6.300
12    B     S  9.9  0.90    7.06   6.900
13    B     S  3.2  0.78    8.10   9.780
14    B    TT  1.1  1.20    7.90  10.200
15    B    TT  3.3  4.00    5.12  15.000
16    B    SS  1.2  5.00    5.23  16.000
17    B    TT  5.4  6.00    5.15  19.000
  cond Array  cutoff1  cutoff2
0    A     S     2.55      1.6
1    A    TT     2.01      2.2
2    B     S     7.06      2.1
3    B    SS     1.00      1.2
4    B    TT     8.01      2.4

Что я хотел бы сделать, это использовать значения отсечки в df2 для изменения моего оригиналанабор данных (df). Я пытаюсь преобразовать все значения «Marker» в df в 0 или 1. Цель - создать еще два фрейма данных, один из которых использует cutoff1 в качестве порога, а другой - cutoff2 в качестве порога. Так, например, для cutoff1, так как анализ AS имеет обрезание 2,55, я хотел бы создать новый фрейм данных, в котором все пары AS со значением Marker <= 2,55 устанавливаются в 0, пары BS со значением<= 7.06 устанавливается в 0 и т. Д., А все остальное в df остается неизменным. Точно так же я хотел бы создать второй фрейм данных, где делается то же самое, но для значений cutoff2. </p>

Я попытался найти переполнение стека для модели, которая уже была сделана, и которую я мог бы адаптировать к своей,но я, кажется, нашел только те, где вы изменяете все значения в одном столбце на одном пороге (например, здесь: Наиболее эффективный способ преобразования значений столбца в Pandas DataFrame ), тогда как здесь есть несколько обрезаний дляодин столбец, который основан на индексации двух других столбцов.

1 Ответ

1 голос
/ 12 октября 2019

Вы можете сделать для каждого отсечения отдельно:

df = df.set_index(['cond', 'Array'])
result = df.merge(df2, on=['cond', 'Array'])
result.loc[result.Marker < result.cutoff1, 'Marker'] = 0
result = result.drop(['cutoff1', 'cutoff2'], axis=1)

print(result)

Выход

   cond Array    X     Y  Marker    Area
0     A     S  1.0  3.10    0.00   3.000
1     A     S  2.0  2.20    0.00   2.000
2     A     S  2.0  2.40    2.55   2.440
3     A     S  3.0  1.20    0.00   1.250
4     A     S  5.1  1.50    3.21   0.156
5     A    TT  3.0  2.10    0.00   2.880
6     A    TT  1.0  1.20    2.01   1.330
7     A    TT  4.0  1.50    0.00   1.530
8     A    TT  7.3  1.33    3.20   1.000
9     B     S  3.2  1.60    0.00   2.000
10    B     S  9.9  0.90    7.06   6.900
11    B     S  3.2  0.78    8.10   9.780
12    B    TT  1.4  1.40    8.01   2.400
13    B    TT  5.5  1.30    9.10   6.300
14    B    TT  1.1  1.20    0.00  10.200
15    B    TT  3.3  4.00    0.00  15.000
16    B    TT  5.4  6.00    0.00  19.000
17    B    SS  1.2  5.00    5.23  16.000

Обратите внимание, что этот пример только для cutoff1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...