Импорт с использованием массива с несколькими разделителями - PullRequest
0 голосов
/ 17 декабря 2018

Я хотел бы знать, как импортировать файл с несколькими разделителями.

У меня есть следующая строка:

"1,000";"2,000";"3,000"

Как мне импортировать данные с помощью numpy?

У меня есть следующий код

data=numpy.loadtxt(filepath,delimiter=';')

Как я могу передать 2-й разделитель для ""

С уважением

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

pandas.read_csv может прочитать такой файл.Он позволяет вам управлять разделителем и символом десятичной точки.

Вот мой файл delim.dat:

"1,000";"2,000";"3,000"
"5,000";"6,000";"7,000"
"8,000";"9,000";"9,100"
"9,250";"9,500";"9,990"

Используйте аргументы delimiter=';' и decimal=',' в pandas.read_csv:

In [11]: import pandas as pd

In [12]: df = pd.read_csv('delim.dat', sep=';', decimal=',', header=None)

In [13]: df
Out[13]: 
      0    1     2
0  1.00  2.0  3.00
1  5.00  6.0  7.00
2  8.00  9.0  9.10
3  9.25  9.5  9.99

Вы также можете использовать numpy.genfromtxt, но вам придется использовать аргумент converters для преобразования каждого поля из bytes в число с плавающей запятой.Например,

In [54]: def myconvert(s):
    ...:     return float(s.strip(b'"').replace(b',', b'.'))
    ...: 
    ...: 

In [55]: a = np.genfromtxt('delim.dat', delimiter=';', converters={k: myconvert for k in range(3)})

In [56]: a
Out[56]: 
array([[1.  , 2.  , 3.  ],
       [5.  , 6.  , 7.  ],
       [8.  , 9.  , 9.1 ],
       [9.25, 9.5 , 9.99]])
0 голосов
/ 17 декабря 2018

У вас есть странные разделители, не говоря уже об использовании запятых в середине числовых литералов.Numpy по умолчанию не настроен на обработку каких-либо из этих вещей, поэтому вам придется немного проанализировать ввод вручную, прежде чем передать его Numpy.Вы можете сделать это, используя некоторые регулярные выражения:

import re
from io import StringIO

# fake file-like object for demonstration
f = StringIO('''"1,000";"2,000";"3,000"''')

s = re.sub('";?"?', ' ', f.read())
s = re.sub(',', '.', s)

arr = np.fromstring(s, sep=' ')
print(arr)

Вывод:

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