我有一个大型(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'返回错误的值?
答案 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_in
和money_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))
在运行其余代码之前。