Чтение нерегулярных данных столбца в python 3.X с использованием панд или numpy - PullRequest
1 голос
/ 28 июня 2019

Ниже мой кусок кода.

import numpy as np

filename1=open(f)
xf = np.loadtxt(filename1, dtype=float)

Ниже приведен мой файл данных.

0.14200E+02 0.18188E+01 0.44604E-03
0.14300E+02 0.18165E+01 0.45498E-03
0.14400E+02-0.17694E+01 0.44615E+03
0.14500E+02-0.17226E+01 0.43743E+03
0.14600E+02-0.16767E+01 0.42882E+03
0.14700E+02-0.16318E+01 0.42033E+03
0.14800E+02-0.15879E+01 0.41196E+03

как можно видеть, есть отрицательные значения, которые занимают пространство между 2 значениями, что приводит к тому, что numpy дает

ValueError: Wrong number of columns at line 3

Это всего лишь небольшой фрагмент моего кода. Я хочу прочитать эти данные, используя numpy или панд. Любое предложение было бы здорово.

Редактировать 1:

@ ZarakiKenpachi Я использовал ваше предложение sep = '| -', но оно дает мне дополнительный 4-й столбец со значениями NaN.

Редактировать 2:

@ Серж Баллеста хорошее предложение, но все это какая-то предварительная обработка. Я хочу, чтобы какая-то встроенная функция делала это в пандах или numpy.

Редактировать 3:

Важное примечание Следует отметить, что в 0.4373E-03

также имеется отрицательный знак

Спасибо-вы

Ответы [ 3 ]

2 голосов
/ 28 июня 2019

Вы можете выполнить предварительную обработку ваших данных, чтобы добавить дополнительный пробел перед тем, как ваши - знаки. Хотя есть много способов сделать это, наилучшим подходом, по моему мнению (чтобы избежать добавления пробелов в начале строки), является использование regex re.sub:

import re

with open(f) as file:
    raw_data = file.readlines()

processed_data = re.sub(r'(?:\d)-', " -", raw_data)

xf = np.loadtxt(processed_data, dtype=float)

Это заменяет каждый -, которому предшествует число с -.

2 голосов
/ 28 июня 2019

np.loadtext может считывать данные из (байтовой строки) генератора, поэтому вы можете фильтровать входной файл при загрузке, чтобы добавить дополнительный перед минусом:

...
def filter(fd):
    rx = re.compile(rb'\d-')
    for line in fd:
        yield rx.sub(b' -', line)

xf = np.loadtxt(filter(open(f, 'b')), dtype=float)

Для этого не требуется предварительно загружать все в память, поэтому ожидается, что она будет эффективно использовать память.


Регулярное выражение требуется, чтобы избежать изменения что-то вроде 0.16545E-012.

В моих тестах на 10 000 строк, это должно быть не более чем на 10% медленнее, чем загрузка всего в память, но потребует гораздо меньше памяти

0 голосов
/ 28 июня 2019

Попробуйте следующий код:

with open('app.txt') as f:
    data = f.read()

import re 
data_mod = []
for number in data.split('\n')[:-1]:
    num = re.findall(r'[\w\.-]+-[\w\.-]',number)
    for n in num:
        number = number.replace('-',' -')
    data_mod.append(number)

with open('mod_text.txt','w') as f:
    for data in data_mod:
        f.write(data+"\n")

filename1='mod_text.txt'
xf = np.loadtxt(filename1, dtype=float)

На самом деле вы должны обработать данные, используя регулярное выражение.После этого вы можете загрузить эти данные так, как вам нужно.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...