我正在尝试使用现有的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行,我发现这是超级慢的(半小时)。我怀疑使用iterrows
和ix
效率低下,但我不确定如何纠正这个问题。
有没有办法可以一次将它应用于整个DataFrame,而不是循环遍历行?或者你有其他建议来加快这个速度吗?
答案 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)
做你想要的?