Сравните значения в матрице с порогом и создайте список превышения его - PullRequest
1 голос
/ 11 июля 2019

Мне нужно сравнить значения в матрице с порогом и создать таблицу не только с индексами, но и с именем столбца, где значение превышает порог.

Например.

Исходная таблица:

enter image description here

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

вот так

enter image description here

и окончательный список

enter image description here

Я пробовал код для создания двоичной матрицы, но он не работает.

import pandas as pd
df = pd.DataFrame({'id':[1,2,3],
           'region':['a','b','c'],
           'threshold':[0.4, 0.5, 0.3],
           'class_1':[0.2, 0.3, 0.3],
           'class_2':[0.6, 0.2, 0.1],
           'class_3':[0.4, 0.6, 0.1]})

df1 = df.set_index(['id', 'region', 'threshold'])
df1=df1.where(df1 >=df['threshold'] , 1, 0).reset_index()

Буду благодарен за любую помощь

1 Ответ

1 голос
/ 11 июля 2019

Сравнение числовых массивов с широковещательной передачей и преобразование логической маски в целые числа:

df.iloc[:, 3:] = (df.iloc[:, 3:].values >= df['threshold'].values[:, None]).astype(int)
print (df)
   id region  threshold  class_1  class_2  class_3
0   1      a        0.4        0        1        1
1   2      b        0.5        0        0        1
2   3      c        0.3        1        0        0

Другое решение:

arr = (df.iloc[:, 3:].values >= df['threshold'].values[:, None]).astype(int)
print (arr)
[[0 1 1]
 [0 0 1]
 [1 0 0]]

df = df.iloc[:, :3].join(pd.DataFrame(arr, columns=df.columns[3:], index=df.index))
print (df)
   id region  threshold  class_1  class_2  class_3
0   1      a        0.4        0        1        1
1   2      b        0.5        0        0        1
2   3      c        0.3        1        0        0

Для столбцов со значениями 1 используйте DataFrame.stack для изменения формы:

df2 = (df.set_index('id')
         .iloc[:, 2:]
         .stack()
         .rename_axis(('id','class'))
         .reset_index(name='a')
         .query('a == 1')
         .drop('a', 1))
print (df2)
   id    class
1   1  class_2
2   1  class_3
5   2  class_3
6   3  class_1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...