熊猫-替换,浮动和总和

时间:2020-05-18 07:54:29

标签: python python-3.x pandas dataframe precision

我有一个例子:

import pandas as pd
import numpy as np

a=[['1','221,51','413,56','636,07'],['13','213','131.86','357,86'],['49','239.83','-238.83','10']]

df = pd.DataFrame(a)
repl_list = {',': '.'}
df.replace(repl_list, regex=True, inplace=True)


df[0] = df[0].astype(float)
df[1] = df[1].astype(float)
df[2] = df[2].astype(float)
df[3] = df[3].astype(float)

df['SUM'] = df.loc[df[0] >= 0, [0, 1, 2]].sum(axis=1)
df['SUM'] = df['SUM'].astype(float)
df['SUM'].fillna(0, inplace=True)
df['T/F'] = np.where((df['SUM'] >= df[3]), True, False)
a = df.loc[df['T/F'] == False]
print(df)

如果sum [3] == SUM列,则应为True,否则为False

为什么使用此代码,结果是:

      0       1       2       3     SUM    T/F
0   1.0  221.51  413.56  636.07  636.07  False
1  13.0  213.00  131.86  357.86  357.86   True
2  49.0  239.83 -238.83   10.00   50.00   True

为什么2中的值即使为假也显示为真? 第一行中存在相同的问题-应该是真的。

此float转换器如何工作? 当我将a[]的值添加到['49','239.83','-288.83','10']时,输出如下:

      0       1       2       3           SUM    T/F
0   1.0  221.51  413.56  636.07  6.360700e+02  False
1  13.0  213.00  131.86  357.86  3.578600e+02   True
2  49.0  239.83 -238.83   10.00  5.000000e+01   True
3  49.0  239.83 -288.83   10.00  5.684342e-14  False

为什么看起来像这样?错误在哪里,该浮点数是什么样的?请说明其工作原理以及为什么会出现错误。

仅当列'3'等于SUM时才应为真-我不明白为什么它不起作用-第一行呢?完全没有道理

2 个答案:

答案 0 :(得分:2)

由于浮点精度,如果可能比较相等的值,则某些值可能不匹配。

这里可以使用numpy.isclose.html来进行比较相等:

df['T/F'] = np.isclose(df['SUM'], df[3])
print(df)
      0       1       2       3     SUM    T/F
0   1.0  221.51  413.56  636.07  636.07   True
1  13.0  213.00  131.86  357.86  357.86   True
2  49.0  239.83 -238.83   10.00   50.00  False

然后添加条件,以比较较高的值并按|进行按位OR链接:

df['T/F'] = np.isclose(df['SUM'], df[3]) | (df['SUM'] > df[3])
print(df)
      0       1       2       3     SUM   T/F
0   1.0  221.51  413.56  636.07  636.07  True
1  13.0  213.00  131.86  357.86  357.86  True
2  49.0  239.83 -238.83   10.00   50.00  True

答案 1 :(得分:1)

这是由于3SUM列中两个值的浮点精度。

df[3][0]
# 636.07
df['SUM'][0]
# 636.0699999999999

要对此进行计数,请使用np.round并设置精度。

df['T/F']=np.round(df['SUM'],2)>=np.round(df[3],2)
print(df)

      0       1       2       3     SUM   T/F
0   1.0  221.51  413.56  636.07  636.07  True
1  13.0  213.00  131.86  357.86  357.86  True
2  49.0  239.83 -238.83   10.00   50.00  True