приведение к двумерному массиву

Получаю с оборудования строку в виде (разделитель табуляция):

#41391Id    Vd

0   8E-05

0.0001  0.05192

0.0002  0.10384

0.0003  0.15568

0.0098  

0.0099  

0.01

Для последующей обработки надо строку привести в двумерный массив.

Для перевода в двумерный массив предполагаю конвертировать строку в List и через NumPy привести к требуемому виду.

# приводит к одномерному списку
items = [float(x) for x in list(text.split())]

Как дописать пропущенные значения в строку не понял. По идее можно отследить сочетание табуляции и перевода каретки и заменить с добавлением нулей Пробовал text.replace(r'\t\n\r', r'\t0.0\n\r') не меняет.

Первую строку удалить:

index_n = text.find('\n')
print(text[index_n:len(text)])

Ответы (2 шт):

Автор решения: CrazyElf

Используйте Pandas и не мучайтесь с "ручным" разбором. Всё придумано до нас:

import pandas as pd
from io import StringIO

data = """
#41391Id    Vd

0   8E-05

0.0001  0.05192

0.0002  0.10384

0.0003  0.15568

0.0098  

0.0099  

0.01
"""

with StringIO(data) as f:
    df = pd.read_csv(f, sep='\s+')
df = df.fillna(0)
print(df)

Вывод:

   #41391Id       Vd
0    0.0000  0.00008
1    0.0001  0.05192
2    0.0002  0.10384
3    0.0003  0.15568
4    0.0098  0.00000
5    0.0099  0.00000
6    0.0100  0.00000

Если на выходе нужен массив Numpy, то просто берёте из датафрейма .values:

print(df.values)

Вывод:

[[0.0000e+00 8.0000e-05]
 [1.0000e-04 5.1920e-02]
 [2.0000e-04 1.0384e-01]
 [3.0000e-04 1.5568e-01]
 [9.8000e-03 0.0000e+00]
 [9.9000e-03 0.0000e+00]
 [1.0000e-02 0.0000e+00]]
→ Ссылка
Автор решения: Gleb

Лучше не делать манипуляций с сырой строкой, а сначала разобрать ее, и уже делать манипуляции с массивами:

str = '' #ваша строка
lines = [x.split('\t') for x in str.split('\n')]
body = lines[1:] #отделяем заголовок
values = [([float(x[0]), 0.0] if len(x)==1 else [float(x[0]),float(x[1])]) for x in body]
→ Ссылка