Чтение данных из текстового файла с отсутствующими значениями

Я хочу читать данные из файла с множеством отсутствующих значений, как в этом примере:

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)

Смотрите также: