Как импортировать массив массивов из CSV в Python - PullRequest
0 голосов
/ 05 февраля 2019

так что в основном я новичок в Python и кое-что не могу сделать.Я импортирую данные из CSV, и мне нужно, чтобы мой data_2d выглядел так:

data_2d = [ [30, 15, 0, 15, 0, 0, 0],
        [32, 10, 0,10, 3, 5, 0],
        [5, 9, 0, 25, 10, 8, 3],
        [22, 10, 0  ,17, 5, 6, 0],
        [7, 15, 0, 30, 3, 5, 0]]

Вместо этого, используя мой текущий код, я получаю следующее:

[['30' '15' '0' '15' '0' '0' '0']
['32' '10' '0' '10' '3' '5' '0']
['5' '9' '0' '25' '10' '8' '3']
['22' '10' '0' '17' '5' '6' '0']
['7' '15' '0' '30' '3' '5' '0']]

Мой кодздесь:

data_2d = [ [30, 15, 0, 15, 0, 0, 0],
        [32, 10, 0,10, 3, 5, 0],
        [5, 9, 0, 25, 10, 8, 3],
        [22, 10, 0  ,17, 5, 6, 0],
        [7, 15, 0, 30, 3, 5, 0]]

data_2d = []

with open('file.csv', newline='\n') as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        data_2d.append(row)

data_array = np.array(data_2d)
data_array = np.delete(data_array, (0), axis=0)
data_array = np.delete(data_array, (0), axis=1)

print("data_array")
print(data_array)

Файл CSV в настоящее время выглядит следующим образом:

Time_Activity;SITTING;STANDING;LAYING;WALKING;WALKING_DOWNSTAIRS;WALKING_UPSTAIRS;RUNNING
8;30;15;0;15;0;0;0
9;32;10;0;10;3;5;0
10;5;9;0;25;10;8;3
11;22;10;0;17;5;6;0
12;7;15;0;30;3;5;0

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

CSV-файл читается как строка.Вы можете преобразовать строку из строки в int при добавлении.Это можно сделать с помощью функции map.

Код:

data_2d.append(list(map(int,row)))
0 голосов
/ 05 февраля 2019

Вы на правильном пути.Две вещи могут помочь в достижении вашей цели и немного упростить код.

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

Пример кода, который работает с вашим вводом:

  data_2d = []
  with open('file.csv', newline='\n') as f:
    reader = csv.reader(f, delimiter=';')
    next(reader) # this will skip that header
    for row in reader:
      data_2d.append([int(x) for x in row]) #this just means take each string and make it an int before appending.

Результат:

[[8, 30, 15, 0, 15, 0, 0, 0], 
[9, 32, 10, 0, 10, 3, 5, 0], 
[10, 5, 9, 0, 25, 10, 8, 3], 
[11, 22, 10, 0, 17, 5, 6, 0], 
[12, 7, 15, 0, 30, 3, 5, 0]]

Несколько полезных ссылок, объясняющих оба дополнения: https://evanhahn.com/python-skip-header-csv-reader/ https://www.pythonforbeginners.com/basics/list-comprehensions-in-python

0 голосов
/ 05 февраля 2019

Для немедленного исправления используйте метод astype для преобразования массива строк в int:

data_array = data_array.astype(int)

Кроме того, np.delete неэффективно и нерекомендуемые;используйте нарезку вместо этого, где это возможно.Вот несколько способов избежать циклов уровня Python: -

numpy

Используя NumPy, вы можете использовать np.genfromtxt:

arr = np.genfromtxt('file.csv', delimiter=';', skip_header=1)[:, 1:]

pandas

В качестве альтернативы, через Панд вы можете использовать pd.read_csv:

arr = pd.read_csv('file.csv', sep=';').iloc[:, 1:].values

print(arr)

# array([[30, 15,  0, 15,  0,  0,  0],
#        [32, 10,  0, 10,  3,  5,  0],
#        [ 5,  9,  0, 25, 10,  8,  3],
#        [22, 10,  0, 17,  5,  6,  0],
#        [ 7, 15,  0, 30,  3,  5,  0]], dtype=int64)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...