Создайте разностные столбцы из одного горячо закодированного столбца - PullRequest
0 голосов
/ 15 февраля 2019

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

    F1    F2    F3    F4
1   0     1     1     0
2   1     0     1     1
3   1     0     0     0
4   0     0     0     1

Я хочу создать несколько новых столбцов для значений здесь:

    F1    F2    F3    F4    S1    S2    S3    S4
1   0     1     1     0     0     2     1     0
2   1     0     0     1     1     0     0     3
3   1     0     0     0     1     0     0     0
4   0     0     0     1     0     0     0     4

Я надеюсь, что есть простой способ сделать это, чтобы вычислить изменения от последнего значения столбца и вывести его в соответствующий столбец.Любая помощь приветствуется, спасибо.

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете сделать:

def func(x):
    # create result array
    result = np.zeros(x.shape, dtype=np.int)

    # get indices of array distinct of zero
    w = np.argwhere(x).ravel()

    # compute the difference between consecutive indices and add the first index + 1
    array = np.hstack(([w[0] + 1], np.ediff1d(w)))

    # set the values on result
    np.put(result, w, array)

    return result


columns = ['S{}'.format(i) for i in range(1, 5)]
s = pd.DataFrame(df.ne(0).apply(func, axis=1).values.tolist(),
                 columns=columns)

result = pd.concat([df, s], axis=1)
print(result)

Вывод

   F1  F2  F3  F4  S1  S2  S3  S4
0   0   1   1   0   0   2   1   0
1   1   0   0   1   1   0   0   3
2   1   0   0   0   1   0   0   0
3   0   0   0   1   0   0   0   4

Обратите внимание, что вам нужно импортировать numpy (import numpy as np) для funcработать.Идея состоит в том, чтобы найти индексы, отличные от нуля, вычислить разницу между последовательными значениями, установить первое значение как index + 1 и сделать это для каждой строки.

...