Запись массива Numpy с NaNs в CSV на python

#python #python-3.x #csv #numpy #nan

#python #python-3.x #csv #numpy #nan

Вопрос:

Я пытаюсь записать 2D numpy array в CSV-файл с помощью np.savetxt .

 import numpy as np

data = np.array([[0,np.nan,2,3],[4,5,np.nan,7],[8,9,10,np.nan]])

np.savetxt("file.csv", data, delimiter=",", fmt='%.2f')
  

Который создает файл file.csv со следующим содержимым.

 0.00,nan,2.00,3.00
4.00,5.00,nan,7.00
8.00,9.00,10.00,nan
  

Как вы можете видеть, файл содержит nan вместо пробелов. Я знаю, что nan — это не строка.

Ожидаемый результат:

 0.00,,2.00,3.00
4.00,5.00,,7.00
8.00,9.00,10.00,
  

Используя pandas , я могу добиться этого, как показано ниже.

 import pandas as pd

df = pd.DataFrame(data)
df.to_csv("file1.csv", index=False)
  

Но я пока воздерживаюсь от использования pandas . Итак, возможно ли достичь этого с помощью numpy ?

Комментарии:

1. Все savetxt , что делается, — это форматированная запись каждой строки вашего массива. '%.2f,%.2f,...'%tuple(row) . Просто базовое форматирование python%.

Ответ №1:

Самое простое решение:

 data1 = data.astype(str)
data1[data1=='nan'] = ''
np.savetxt("file.csv", data1, delimiter=",", fmt="%s")
  

Комментарии:

1. Я надеюсь, что это не повлияет на размер файла, преобразуя их в строку и сохраняя их?

2. Файл представляет собой текстовый файл. В любом случае, Numpy неявно преобразует все числа в строки перед их записью.

3. С %s вы теряете контроль над шириной столбца и десятичной точностью, над теми вещами, которые предоставляют %.2f форматы.

Ответ №2:

Вы можете решить эту проблему, используя pandas с na_rep параметром. Например:

 df.to_csv(r'pathdf.csv', sep=',', na_rep=np.NaN)