pandas中列的元素乘法

时间:2018-03-24 19:54:04

标签: python pandas dataframe

我试过不同的解决方案来引用这个问题,但没有任何效果。 我有3列float类型,我想逐行比较那些与另一列的moltiplication。原始数据框如下所示:

+------+------+------+--------+
| Col1 | Col2 | Col3 | Result |
+------+------+------+--------+
|  4.5 |  2.0 |  2.0 |   18.0 |
|  2.3 |  1.0 |  3.5 |   8.05 |
|  2.5 |  5.2 |  3.0 |    5.0 |
+------+------+------+--------+

第三行显然是错误的,第一行和第二行是对的。 所以我创建了一个名为Check的新列,它应该告诉我,如果列Result是col1,col2和col3的乘法。

df['Check'] = np.where((df.col1*df.col2*df.col3) != falseVol.VOLUM,'Result is wrong', 'Result is right')

因为我得到了错误的结果,我尝试了几种方法来增加列并创建另一列来存储计算结果:

df['calculated'] = df['col1'] * df['col2'] * df['col3']
df['calculated'] = df['col1'].multiply(df['col2'] * df['col3'], axis=0)

每个都给我匹配的结果,但检查不起作用。

如何逐行多列并进行比较工作? 谢谢。

1 个答案:

答案 0 :(得分:2)

使用df.prod / np.prod来增加列数(有效地推广到多列),并使用np.isclose执行与df.Result的元素浮动比较。

np.isclose(df.iloc[:, :-1].prod(axis=1), df.Result)

或者,

np.isclose(np.prod(df.iloc[:, :-1], axis=1), df.Result)

array([ True,  True, False])

其中,

df.iloc[:, :-1].prod(axis=1)

0    18.00
1     8.05
2    39.00
dtype: float64

请注意,执行直接eq比较会产生错误的结果 -

df.iloc[:, :-1].prod(axis=1).eq(df.Result)

0     True
1    False   # incorrect
2    False
dtype: bool

这是floating point inaccuracies的结果。