Python-如何在数据框的元素之间应用点积

时间:2018-07-20 17:53:24

标签: python pandas

我有两个数据帧。两者都有一列numpy数组,每个条目包含3个元素,例如:

0             [0.552347, 0.762896, 0.336009]
1             [0.530716, 0.808313, 0.254895]
2             [0.528786, 0.734991, 0.424469]
3            [0.202799, 0.669395, -0.714691]
4           [0.791936, -0.100072, -0.602347]
6             [0.428896, -0.122712, 0.89498]

如何获取一个数据帧的每一行与另一数据帧的对应行的点积?意思是,我想计算df1的第一个元素与df2的第一个元素,然后计算df1的第二个元素与df2的第二个元素,再计算第三个元素的点积。

3 个答案:

答案 0 :(得分:3)

df1 = pd.DataFrame([(np.array([0.552347, 0.762896, 0.336009]), ), 
                    (np.array([0.530716, 0.808313, 0.254895]), )], columns=['v1'])

df2 = pd.DataFrame([(np.array([0.528786, 0.734991, 0.424469]), ), 
                    (np.array([0.202799, 0.669395, -0.714691]), )], columns=['v2'])

pd.concat((df1, df2), axis=1).apply(lambda row: row.v1.dot(row.v2), axis=1)

0    0.995420
1    0.466538

答案 1 :(得分:2)

假设它们的长度与df1,df2相同

[x.dot(y) for x, y in zip(df1.col1.values,df2.col1.values)]
Out[648]: [0.9999995633060001, 1.00000083965]

答案 2 :(得分:0)

手动计算点积非常快。为此,如果两个数据帧共享相同的索引,则可以使用mulsum

df1.col.mul(df2.col).apply(sum)

如果它们不共享相同的索引(但长度相同),请首先使用reset_index

df1.reset_index().col.mul(df2.reset_index().col).apply(sum)

示例

>>> df1
         col
0  [0, 1, 2]
1  [3, 4, 5]
>>> df2
         col
0  [5, 6, 7]
1  [1, 2, 3]

>>> df1.col.mul(df2.col).apply(sum)
0    20
1    26