在具有NaN值的熊猫数据框上运行时精度下降

时间:2020-01-23 23:21:24

标签: python pandas dataframe precision

我有一个熊猫数据框,我想在其中减去两个列值:

df = pd.DataFrame({"Label":["NoPrecisionLoss"],
                   "FirstNsae":[1577434369549916003],
                   "SecondNsae":[1577434369549938679]})
print(df.SecondNsae - df.FirstNsae)

换位的结果是正确的22676

现在,当输入数据框获得第二行,且其中包含nan值时:

df2 = pd.DataFrame({"Label":["PrecisionLoss","NeedsToBeRemoved"],
                   "FirstNsae":[1577434369549916003,np.nan],
                   "SecondNsae":[1577434369549938679,66666666666666]})

nan值很讨厌,因此我们将删除包含它的行:

df2 = df2[np.isfinite(df2.FirstNsae) & np.isfinite(df2.SecondNsae)]

让我们将FirstNsae列转换回为int(由于第二行中的FirstNsae值,float被指定为nan) :

df2 = df2.astype({"FirstNsae":int})  # this is futile since precision as already been lost
print(df2.SecondNsae - df2.FirstNsae)

打印两列之间的差异将产生22775

在使用以下方法构造具有极大整数的数据帧时,如何避免精度下降 nan是否可能存在?

谢谢!

1 个答案:

答案 0 :(得分:1)

要详细说明piRSquared的答案(在原始问题的评论中),以下是解决原始问题的方法:

df2 = pd.DataFrame({"Label":["PrecisionLoss","NeedsToBeRemoved"],
                   "FirstNsae":[1577434369549916003,np.nan],
                   "SecondNsae"[1577434369549938679,66666666666666]},
                   dtype=object)
df2 = df2[np.isfinite(df2.FirstNsae.astype(float)) & 
          np.isfinite(df2.SecondNsae.astype(float)]

print(df2.SecondNsae - df2.FirstNsae)

打印22676

更新:自熊猫的1.0.0版本以来,这不再是一个问题。整数值允许为NaN。 https://pandas.pydata.org/pandas-docs/version/1.0.0/user_guide/missing_data.html#missing-data-na