Совпадение по нескольким столбцам с использованием массива - PullRequest
0 голосов
/ 18 апреля 2020

Я работаю над проектом, в котором мой исходный фрейм данных:

      A     B    C   label
0     1     2    2    Nan
1     2     4    5    7
2     3     6    5    Nan
3     4     8    7    Nan
4     5    10    3    8
5     6    12    4    8

Но у меня есть массив с новыми метками для определенных точек (для этого я использовал только столбцы A и B) в исходный кадр данных. Примерно так:

X_labeled = [[2, 4], [3,6]]
y_labeled = [5,9]

Моя цель - добавить новые метки в исходный фрейм данных. Я знаю, что комбинация А и В уникальна. Какой самый быстрый способ назначить новую метку правильной строке?

Это моя попытка:

y_labeled = np.array(y).astype('float64')

    current_position = 0
    for point in X_labeled:
        row = df.loc[(df['A'] == point[0]) & (df['B'] == point[1])]
        df.at[row.index, 'label'] = y_labeled[current_position]
        current_position += 1

Требуемый вывод (строки с индексами 1 и 2 изменены):

       A     B    C   label
0     1     2    2    Nan
1     2     4    5    5
2     3     6    5    9
3     4     8    7    Nan
4     5    10    3    8
5     6    12    4    8

Для небольших наборов данных это может быть хорошо, в настоящее время я использую его для наборов данных с более чем 25000 меток. Есть ли способ, который быстрее?

Кроме того, в некоторых случаях я использовал все столбцы ожидают столбец «метка». Этот фрейм данных существует из 64 столбцов, поэтому мой метод не может быть использован здесь. У кого-нибудь есть идея улучшить это?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Лучшее решение - превратить массивы в массив данных и использовать df.update():

new = pd.DataFrame(X_labeled, columns=['A', 'B'])
new['label'] = y_labeled
new = new.set_index(['A', 'B'])
df = df.set_index(['A', 'B'])
df.update(new)
df = df.reset_index()
1 голос
/ 18 апреля 2020

Вот подход, основанный на numpy, направленный на повышение производительности. Чтобы векторизовать это, мы хотим проверить членство строк в X_labeled в столбцах A и B. Поэтому мы можем рассматривать эти два столбца как одномерные массивы (на основе этот ответ ) и , а затем мы можем использовать np.in1d для индексации кадра данных и присвойте значения в y_labeled:

import numpy as np

X_labeled = [[2, 4], [3,6]]
y_labeled = [5,9]

a = df.values[:,:2].astype(int) #indexing on A and B

def view_as_1d(a):
    a = np.ascontiguousarray(a)
    return a.view(np.dtype((np.void, a.dtype.itemsize * a.shape[-1])))

ix = np.in1d(view_as_1d(a), view_as_1d(X_labeled))
df.loc[ix, 'label'] = y_labeled

print(df)

   A   B  C label
0  1   2  2   Nan
1  2   4  5     5
2  3   6  5     9
3  4   8  7   Nan
4  5  10  3     8
5  6  12  4     8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...