我有一个例子:
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
时才应为真-我不明白为什么它不起作用-第一行呢?完全没有道理
答案 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)
这是由于3
和SUM
列中两个值的浮点精度。
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