Большой идентификатор изменился: не пропускаем целые через float
В выгрузке заказов есть длинный числовой идентификатор и одна пустая ячейка. pandas прочитал столбец как float, после очистки его привели к Int64. Тип выглядит правильным, но один id уже отличается на единицу. При соединении со справочником заказ не находится.
У float64 ограничена точность целых значений: не каждое целое больше 2**53 представимо точно. Если округление произошло при чтении, последующее приведение к целому не восстанавливает исходные цифры. Тип нужно выбрать до первой потери информации.
Как изменить решение
from io import StringIO
import pandas as pd
text = 'id,value\n9007199254740993,1\n,2\n'
df = pd.read_csv(StringIO(text), dtype={'id': 'string'})
assert df.loc[0, 'id'] == '9007199254740993'
assert pd.isna(df.loc[1, 'id'])
values = pd.Series([9007199254740993, None], dtype='Int64')
assert values.iloc[0] == 9007199254740993
print(df['id'].tolist())
print(values.tolist())Строковый идентификатор сохранил все цифры и отдельный пропуск. Nullable Int64 тоже хранит это значение точно, поскольку оно попадает в диапазон знакового 64-битного целого. В примере массив создаётся сразу из Python int, без промежуточного float.
Для внешних идентификаторов строковый тип обычно удобнее: арифметика над ними не нужна, а ведущие нули могут быть значимы. Int64 выбирайте для настоящих целочисленных измерений в его диапазоне. Если источник отдаёт id числом в JSON, проверьте, не потерял ли точность ещё предыдущий JavaScript-сервис.
Что проверить на своих данных
Для запуска установите pandas. Добавьте идентификатор с ведущими нулями и значение возле верхней границы int64. Проверьте не только dtype, но и точное равенство исходной строке. Сверка первых и последних цифр или проверка длины не обнаруживает округление внутри числа.
Схема чтения должна одинаково применяться ко всем частям большого файла. Если первый chunk не содержит пропусков, а следующий содержит, автоматический вывод типов может дать разные представления одного поля. Сохраните dtype в функции импорта и проверьте соединение на длинных ключах в обоих направлениях. Идентификатор — это связь между системами; исправлять уже изменённый ключ догадкой по соседним строкам нельзя.
Практика дальше
Точный ключ нужен на всём пути от CSV до merge. В тренажёре «NumPy и pandas» вы проверяете чтение выгрузок, очищаете таблицы и разбираете появление лишних строк после объединения. Итоговая практика связывает заказы с пользователями и заканчивается клиентским отчётом.
Посмотреть программу и практику курса
Источник: Большой идентификатор изменился — официальная документация.
Другие задачи по теме: Календарь, пропуски и точность вычислений.
Продолжить на практике
- NumPy и pandas: практический тренажёр ↗
Бесплатный тренажёр NumPy и pandas для тех, кто знает основы Python. Научитесь очищать таблицы, объединять данные и собирать отчёты: 31 урок и 124 задачи с кодом и автоматической проверкой.
