在numpy / pandas中为每列添加正方形/立方体/等的列

时间:2019-10-10 17:17:51

标签: python pandas numpy dataframe regression

我正在尝试获取一组由N行组成的数据,并扩展每一行以包括该行中每一列的平方/立方/等(升至多少由变量j确定)。数据以pandas DataFrame开头,但可以变成一个numpy数组。

例如: 如果该行是[3,2]并且j是3,则该行应转换为[3,2,9,4,4,27,8]

我目前有一个半工作版本,其中包含一堆嵌套的for循环,非常难看。我希望有一种更干净的方法来进行这种转换,以便调试变得更容易。

我正在寻找的行为与sklearns PolynomialFeature基本上相同,但是我试图仅在numpy和/或pandas中实现。

谢谢!

2 个答案:

答案 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