我有一个多列的 Pandas 数据框。我想从行中的值和另一个列向量数据帧weighted_sum创建一个新列weightweighted_sum应该具有以下值:
row[weighted_sum] = row[col0]*weight[0] + row[col1]*weight[1] + row[col2]*weight[2] + ...
我找到了函数sum(axis=1),但是它不允许我与weight相乘。

编辑:
我改变了一点。
weight看起来像这样:

     0
col1 0.5
col2 0.3
col3 0.2
df看起来像这样:
col1 col2 col3
1.0  2.2  3.5
6.1  0.4  1.2
df*weight返回一个充满了Nan值的数据框。

最佳答案

问题在于,您正在将一个框架与一个具有不同行索引的不同大小的框架相乘。解决方法如下:

In [121]: df = DataFrame([[1,2.2,3.5],[6.1,0.4,1.2]], columns=list('abc'))

In [122]: weight = DataFrame(Series([0.5, 0.3, 0.2], index=list('abc'), name=0))

In [123]: df
Out[123]:
           a          b          c
0       1.00       2.20       3.50
1       6.10       0.40       1.20

In [124]: weight
Out[124]:
           0
a       0.50
b       0.30
c       0.20

In [125]: df * weight
Out[125]:
           0          a          b          c
0        nan        nan        nan        nan
1        nan        nan        nan        nan
a        nan        nan        nan        nan
b        nan        nan        nan        nan
c        nan        nan        nan        nan

您可以访问以下列:
In [126]: df * weight[0]
Out[126]:
           a          b          c
0       0.50       0.66       0.70
1       3.05       0.12       0.24

In [128]: (df * weight[0]).sum(1)
Out[128]:
0         1.86
1         3.41
dtype: float64

或使用dot取回另一个DataFrame
In [127]: df.dot(weight)
Out[127]:
           0
0       1.86
1       3.41

整合在一起:
In [130]: df['weighted_sum'] = df.dot(weight)

In [131]: df
Out[131]:
           a          b          c  weighted_sum
0       1.00       2.20       3.50          1.86
1       6.10       0.40       1.20          3.41

这是每种方法的timeit,使用了更大的DataFrame
In [145]: df = DataFrame(randn(10000000, 3), columns=list('abc'))
weight
In [146]: weight = DataFrame(Series([0.5, 0.3, 0.2], index=list('abc'), name=0))

In [147]: timeit df.dot(weight)
10 loops, best of 3: 57.5 ms per loop

In [148]: timeit (df * weight[0]).sum(1)
10 loops, best of 3: 125 ms per loop

对于广泛的DataFrame:
In [162]: df = DataFrame(randn(10000, 1000))

In [163]: weight = DataFrame(randn(1000, 1))

In [164]: timeit df.dot(weight)
100 loops, best of 3: 5.14 ms per loop

In [165]: timeit (df * weight[0]).sum(1)
10 loops, best of 3: 41.8 ms per loop

因此,dot更快,更易读。

注意:如果您的任何数据包含NaN,则不应使用dot,而应使用乘和求和方法。 dot无法处理NaN,因为它只是numpy.dot()(不处理NaN)的薄包装。

关于python - 如何计算 Pandas 中所有元素的加权总和?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18419962/

10-12 18:20