потеря точности при работе на pandas кадре данных со значениями NaN - PullRequest
3 голосов
/ 24 января 2020

У меня есть pandas фрейм данных, где я хотел бы вычесть два значения столбца:

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 Ответ

1 голос
/ 24 января 2020

Чтобы уточнить ответ 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!

Обновление : Начиная с версии Panda 1.0.0, это больше не проблема. Целочисленные значения могут быть NaN. https://pandas.pydata.org/pandas-docs/version/1.0.0/user_guide/missing_data.html#missing -data-на

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...