#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)