Pandas:df.equals总是返回false,即使是True

时间:2018-01-01 22:47:56

标签: python pandas

我有一个大型(5000+行)CSV事务的文件,我们知道这些事件包含一些错误。

它包含以下字段:

date         description      money_in     money_out   balance

01-01-2017   stringvalue        349            0        1000
02-01-2017   stringvalue         0           100         900
03-01-2017   stringvalue        10             0         890

要检查哪些行包含错误数据,我已添加以下代码:

df['difference'] = df['money In'] - df['money Out']
df['BalanceDif'] = df['balance'] - df['balance'].shift()
df['RowCorrect'] = df['BalanceDif'].equals(df['difference'])

这给出了以下(有点令人费解)输出(第一列遗漏):

Balance    difference  BalanceDif  RowCorrect  
682.36        30         30          False
758.36        76         76          False
708.36       -50        -50          False
707.57       -0.79       -0.79       False
712.57        5          5           False
762.57        50         50          False

有谁知道我做错了什么,以及为什么' df.RowCorrect'返回错误的值?

2 个答案:

答案 0 :(得分:2)

请注意equals()查看两个数据帧或两个系列的相等性,以便:

df.difference.equals(df.BalanceDif)
# True

为了达到你想要的效果,你可以进行元素比较:

df['RowCorrect'] = df.difference == df.BalanceDif
df

    BalanceDif  difference  RowCorrect
0   30.00       30.00       True
1   76.00       76.00       True
2   -50.00      -50.00      True
3   -0.79       -0.79       True
4   5.00        5.00        True
5   50.00       50.00       True

答案 1 :(得分:1)

你应该避免比较浮点数的相等性。查看this answer了解更多详情。将相关列转换为带有2个浮点的小数。您的代码之后应该可以正常工作。

或者,您可以将money_inmoney_out列转换为整数(以美分为单位)。即, df['money_in'] = df['money_in'].apply(lambda x: int(100*x)) df['money_out'] = df['money_in'].apply(lambda x: int(100*x))

在运行其余代码之前。