Почему pandas .to_csv сбрасывает числа при попытке сохранить NaN? - PullRequest
0 голосов
/ 09 февраля 2020

Учитывая pandas фрейм данных

 df = pd.DataFrame([(290122, 0.20, np.nan),
                    (1900, 1.20, "ABC")],
                     columns = ("number", "x", "class")
                  )

     number    x class
 0   290122  0.2   NaN
 1     1900  1.2   ABC

Затем экспортируя его в CSV, я хотел бы сохранить NaN, например, как "NULL" или "NaN",

 df.to_csv("df.csv", encoding="utf-8", index=False, na_rep="NULL")

Тем не менее, открывая CSV, я получаю следующее: то есть последние две цифры номера в первой ячейке отбрасываются.

enter image description here Вот вывод, открытый в текстовом редакторе:

 number,x,class
 2901,0.20,NULL
 1900,1.20,ABC

Как уже упоминалось, при удалении аргумента na_rep я получаю, как и ожидалось:

 number,x,class
 290122,0.20,
 1900,1.20,ABC

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Да, это на самом деле ошибка в pandas 1.0.0. Исправлено в 1.0.1. См. Примечания к выпуску и https://github.com/pandas-dev/pandas/issues/25099.

В зависимости от ваших данных можно быстро обойти:

import numpy as np
import pandas as pd

na_rep = 'NULL'
if pd.__version__ == '1.0.0':
    na_rep_wrk = 8 * na_rep

data = [(290122, 0.20, 'NULL'), (2**40 - 1, 3.20, 'NULL'), (1900, 1.20, "ABC")]
df = pd.DataFrame(data, columns=("number", "x", "class"))

df.to_csv("df.csv", encoding="utf-8", index=False, na_rep=na_rep_wrk)
df2 = pd.read_csv('df.csv', keep_default_na=False)

assert(np.all(df == df2))

Это дает файл CSV:

number,x,class
290122,0.2,NULL
109951162777,3.2,NULL
1900,1.2,ABC

0 голосов
/ 09 февраля 2020

В файлах .csv, при чтении или записи из pandas - np.nan сохраняется в файле как '' (пустая строка), поэтому не используйте na_rep = 'NULL' и вместо этого при чтении из pandas снова (после сохранения), сделайте следующее:

for col in df.columns:
   df[col].apply(lambda x: np.nan if x == '' else x)

Хотя все пустые строки по умолчанию считываются как NaN. Это все еще полезно - просто чтобы быть в безопасности.

Я сталкивался с этой проблемой раньше и обнаружил, что просто нет другого способа исправить это, но если я найду один (безошибочно сохраняя NAN или NULL), я буду обновлять здесь.

...