我试过不同的解决方案来引用这个问题,但没有任何效果。 我有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)
每个都给我匹配的结果,但检查不起作用。
如何逐行多列并进行比较工作? 谢谢。
答案 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