Pandas - 使用每行中元素的点积创建新的DataFrame列

时间:2015-02-20 22:46:10

标签: python pandas dataframe vectorization dot-product

我正在尝试使用现有的DataFrame并附加一个新列。

假设我有这个DataFrame(只是一些随机数):

    a           b           c            d          e
0   2.847674    0.890958    -1.785646   -0.648289   1.178657
1   -0.865278   0.696976    1.522485    -0.248514   1.004034
2   -2.229555   -0.037372   -1.380972   -0.880361   -0.532428
3   -0.057895   -2.193053   -0.691445   -0.588935   -0.883624

我想创建一个新列'f',它将每行乘以'cost'向量,例如[1,0,0,0,0]。因此,对于行0,列f中的输出应为2.847674。

这是我目前使用的功能:

def addEstimate (df, costs): 
   row_iterator = df.iterrows()

   for i, row in row_iterator:
      df.ix[i, 'f'] = np.dot(costs, df.ix[i])

我正在使用一个15个元素的向量,超过~20k行,我发现这是超级慢的(半小时)。我怀疑使用iterrowsix效率低下,但我不确定如何纠正这个问题。

有没有办法可以一次将它应用于整个DataFrame,而不是循环遍历行?或者你有其他建议来加快这个速度吗?

2 个答案:

答案 0 :(得分:4)

您可以使用df['f'] = df.dot(costs)创建新列。

dot已经是一个DataFrame方法:将它作为一个整体应用于DataFrame将比循环DataFrame并将np.dot应用于各个行要快得多。

例如:

>>> df # an example DataFrame
    a   b   c   d   e
0   0   1   2   3   4
1  12  13  14  15  16
2  24  25  26  27  28
3  36  37  38  39  40

>>> costs = [1, 0, 0, 0, 2]
>>> df['f'] = df.dot(costs)
>>> df
    a   b   c   d   e    f
0   0   1   2   3   4    8
1  12  13  14  15  16   44
2  24  25  26  27  28   80
3  36  37  38  39  40  116

答案 1 :(得分:0)

Pandas也有点功能。确实

df['dotproduct'] = df.dot(costs)

做你想要的?