Проблема с плавающей точкой при использовании списка (zip (...)) в столбцах Dataframe float32 - PullRequest
1 голос
/ 04 июня 2019

При попытке создать столбец кортежа, состоящий из координат широты и долготы из двух отдельных столбцов, я наткнулся на zip как довольно быструю альтернативу itertuples, составить список и т. Д. Это должно быть быстро, потому что я имею делос примерно 4M строк, и я не хочу тратить свое время на создание атрибутов.

Хорошо, мой вопрос прекрасно задается, глядя на вывод этого Кодекса: что происходит и как это можно сделатьбыть предотвращенным?Я абсолютно уверен, что, например, 52.353500 настолько точен, насколько это возможно, и Dataframe не просто вырезает его для просмотра - потому что это уже равняется (очень грубой) точности позиционирования в 10 сантиметров.

print(df['lat'].head())
print(df['long'].head())
list(zip(df['lat'].head(), df['long'].head()))

Вывод:

14    52.353500
37    52.355511
42    52.354019
44    52.373829
83    52.354599
Name: lat, dtype: float32

14    5.00611
37    4.90732
42    4.92045
44    4.84816
83    4.89405
Name: long, dtype: float32

[(52.35350036621094, 5.006110191345215),
 (52.35551071166992, 4.907320022583008),
 (52.35401916503906, 4.920450210571289),
 (52.37382888793945, 4.8481597900390625),
 (52.35459899902344, 4.894050121307373)]

В соответствии с запросом: Dataframe был загружен с использованием read_csv с dtype float32 для обоих столбцов.

Решение: Это была смесь из меня, не зная ограниченийСерийное представление чисел с плавающей запятой, не использующее float_precision при чтении данных и использующее float32 в сочетании с float_precision.Дети, используйте float dtype и пусть Pandas решит (использовать float64).

1 Ответ

2 голосов
/ 04 июня 2019

Это совершенно определенное поведение, pandas усекает завершающие цифры на основе заданной точности:

import math  

math.pi  
# 3.141592653589793

pi имеет здесь 15 цифр точности.Однако в серии он не отображается так:

pd.Series([math.pi])                                                                                                   

0    3.141593
dtype: float64

pd.Series([math.pi]) .tolist()                                                                                         
# [3.141592653589793]

Это потому, что

pd.get_option('precision')                                                                                             
# 6

Подробнее о Параметры и настройки и о том, какВы можете изменить их.

Если вы хотите на самом деле округлить ваши поплавки с определенной точностью, используйте round:

pd.Series([math.pi]).round(decimals=6).tolist()                                                                        
# [3.141593]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...