我有一个熊猫数据框,我想在其中减去两个列值:
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
是否可能存在?
谢谢!
答案 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