выбрать строки, равные numpy ому массиву - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть датафрейм Panda "pat_data" , который выглядит следующим образом: (столбцы с f1 по f5 содержат двоичные числа)

Stay_id | f1 | f2 | f3 | f4 | f5
----------------------------------
1011    |  1 |  0 |  1 |  1 | 0
1011    |  0 |  1 |  0 |  0 | 1
.
.
.
1011    |  0 |  1 |  1 |  1 | 1

и подмножество значений, сохраненных как numpy nd-массив вроде этого:

[[0 1 1 1 1]
[1 0 1 1 0]
[0 0 0 0 0]
.....]

что я хочу сделать, это выбрать строки из "pat_data" где вектор строки (например, для первой строки, вектор is [1 0 1 1 0]) равен одному из векторов в массиве numpy. Например, первая и последняя строка из фрейма данных находятся в массиве nd, поэтому я должен выбрать их.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Поскольку ваши данные являются двоичными, вы можете использовать isin с небольшим фокусом:

# set up
df = pd.DataFrame([[1,0,1,1,0],[0,1,0,0,1],[0,1,1,1,1]],
                 columns=[f'f{i}' for i in '12345'])

arr = np.array([[0,1,1,1,1],[1,0,1,1,0],[0,0,0,0,0]])

# is in:
s = (df[[f'f{i}' for i in '12345']]
         .mul(2**np.arange(5)).sum(1)           # convert binary to 5-bit int
         .isin((arr * (2**np.arange(5))).sum(1) # convert binary to 5-bit int
              )
    )
df[s]

Вывод:

   f1  f2  f3  f4  f5
0   1   0   1   1   0
2   0   1   1   1   1
0 голосов
/ 21 февраля 2020

вы можете преобразовать DataFrame в массив numpy, используя .values следующим образом:

data = pat_data.values

Я назову ваш nd-массив как query. Тогда результат, который вы получите sh:

pairwise_compare = data == query[:, np.newaxis, :]
result = pairwise_compare.all(axis=2).any(axis=1)

Что произошло: Мы использовали numpy вещание , чтобы ускорить сравнение. Предположим, что data.shape - это (n, k), а query.shape - (q, k). (Также query[:, np.newaxis, :].shape - это (q, 1, k)).

Тогда pairwise_compare.shape (из-за трансляции) будет (q, n, k). Он представляет равенство каждого элемента каждой строки query и каждой строки data! После этого мы выбираем результаты, в которых all элементы равны, а затем выбираем запросы, соответствующие any строке в data.

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