我正在尝试获取一组由N行组成的数据,并扩展每一行以包括该行中每一列的平方/立方/等(升至多少由变量j确定)。数据以pandas DataFrame开头,但可以变成一个numpy数组。
例如: 如果该行是[3,2]并且j是3,则该行应转换为[3,2,9,4,4,27,8]
我目前有一个半工作版本,其中包含一堆嵌套的for循环,非常难看。我希望有一种更干净的方法来进行这种转换,以便调试变得更容易。
我正在寻找的行为与sklearns PolynomialFeature基本上相同,但是我试图仅在numpy和/或pandas中实现。
谢谢!
答案 0 :(得分:2)
将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 :(得分:1)
尝试使用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