Чтение данных из текстового файла с отсутствующими значениями
Я хочу читать данные из файла с множеством отсутствующих значений, как в этом примере:
1,2,3,4,5
6,,,7,8
,,9,10,11
Я использую функцию numpy.loadtxt:
data = numpy.loadtxt('test.data', delimiter=',')
Проблема в том, что недостающие значения ломают loadtxt (я получаю значение ValueError: невозможно преобразовать строку в float: ", без сомнения, из-за двух или более последовательных разделителей).
Есть ли способ сделать это автоматически, с loadtxt или другой функцией, или мне нужно укусить пулю и разобрать каждую строку вручную?
Ответы
Ответ 1
Я бы использовал genfromtxt:
>>> from numpy import genfromtxt
>>> genfromtxt("missing1.dat", delimiter=",")
array([[ 1., 2., 3., 4., 5.],
[ 6., nan, nan, 7., 8.],
[ nan, nan, 9., 10., 11.]])
а затем сделайте все с помощью nans (измените их на что-нибудь, используйте вместо этого маску и т.д.). Некоторые из них можно сделать inline:
>>> genfromtxt("missing1.dat", delimiter=",", filling_values=99)
array([[ 1., 2., 3., 4., 5.],
[ 6., 99., 99., 7., 8.],
[ 99., 99., 9., 10., 11.]])
Ответ 2
Будьте осторожны, что для этого, согласно моему тесту, клетки-каркасы не обнаружены, а только числовые значения, поэтому, если у вас есть таблица со строками и числами, должен быть другой способ.
Мой пример:
upeak_names.txt:
id name Distance name2 Distance2 name3 Distance3
upeak-3 NOC2L -161 KLHL17 -1135 NOC2L -162
>>>table= genfromtxt('upeak_names.txt', delimiter="\t")
>>>comb_table[2,]
>>>array([ nan, nan, -161., nan, -1135., nan, -162.])
Ответ 3
Это связано с тем, что функция ожидает вернуть пустой массив со всеми ячейками одного типа.
Если вам нужна таблица со смешанными строками и числом, вы должны вместо этого прочитать ее в структурированный массив, также вы, вероятно, захотите добавить skip_header=1
чтобы пропустить первую строку, т.е. в вашем случае что-то вроде:
np.genfromtxt('upeak_names.txt', delimiter="\t", dtype="S10,S10,f4,S10,f4,S10,f4",
names=["id", "name", "Distance", "name2", "Distance2", "name3", "Distance3], skip_header=1)
Смотрите также: