Добавьте столбец для квадратов / кубов / и т. Д. Для каждого столбца в numpy / pandas - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь взять набор данных, который состоит из N строк, и расширить каждую строку, чтобы включить квадраты / кубы и т. Д. Каждого столбца в этой строке (какая мощность зависит от переменной j). Данные начинаются как pandas DataFrame, но могут быть превращены в пустой массив.

Например: если строка имеет значение [3,2], а j равно 3, строка должна быть преобразована в [3, 2, 9, 4, 27, 8]

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

Поведение, которое я ищу, в основном такое же, как sklearns PolynomialFeature, но я пытаюсьсделать это только в numpy и / или pandas.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Используйте трансляцию NumPy для векторизованного решения -

In [66]: a = np.array([3,2])

In [67]: j = 3

In [68]: a**np.arange(1,j+1)[:,None]
Out[68]: 
array([[ 3,  2],
       [ 9,  4],
       [27,  8]])

И есть встроенная NumPy: np.vander -

In [142]: np.vander(a,j+1).T[::-1][1:]
Out[142]: 
array([[ 3,  2],
       [ 9,  4],
       [27,  8]])

Или с increasingквартира установлена ​​как True -

In [180]: np.vander(a,j+1,increasing=True).T[1:]
Out[180]: 
array([[ 3,  2],
       [ 9,  4],
       [27,  8]])
1 голос
/ 10 октября 2019

Попробуйте concat с опцией ignore_index, чтобы удалить дубликаты в именах столбцов:

df = pd.DataFrame(np.arange(9).reshape(3,3))

j = 3

pd.concat([df**i for i in range(1,j+1)], axis=1,ignore_index=True)

Вывод:

   0  1  2   3   4   5    6    7    8
0  0  1  2   0   1   4    0    1    8
1  3  4  5   9  16  25   27   64  125
2  6  7  8  36  49  64  216  343  512
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...