Python: создать список массивов - PullRequest
0 голосов
/ 01 октября 2019

Я несколько дней пытался создать питона list of arrays из CSV-файла, содержащего пользовательские GPS-траектории, таким образом, чтобы результат имел вид:

[[id_1_trajectories_array],[id_2_trajectories_array]....[id_n_trajectories_array]]

, чтобы каждыймассив представляет собой набор журналов GPS [timestamp, lat, lon, travel_mode] для одного пользователя.

Вот как выглядит файл csv (myfile.csv):

id  timestamp   lat     lon     travel_mode
58  1458216259  41.152  -8.628  car
58  1458216298  41.153  -8.629  car
58  1458216384  41.154  -8.629  car
.
.
59  1458217610  41.155  -8.626  foot
59  1458217657  41.156  -8.625  foot
59  1458217658  41.157  -8.625  foot

Цель состоит в том, чтобы создать список GPSрегистрирует массивы вида:

[[[1458216259, 41.152, -8.628, car],
  [1458216298, 41.153, -8.629, car],
  [1458216384,  41.154, -8.629  car]],
.
.
[[1458217610,   41.155, -8.626, foot],
 [1458217657,   41.156, -8.625, foot],
 [1458217658,   41.157, -8.625, foot]]]

Я пытался превратить arrays в lists, я также пытался numpy.append(), но не смог достичь желаемой цели.

1 Ответ

1 голос
/ 01 октября 2019

Не уверен, что это лучший или самый "питонский" способ, но это работает:

import csv
from collections import defaultdict

with open('myfile.csv', newline='') as csvfile:
    # Read csv file into dictionary
    csv_data = csv.DictReader(csvfile, fieldnames=["id"], delimiter=' ', skipinitialspace=True)
    # Skip header line
    next(csv_data)
    # This is a dictionary of lists with key=id
    data = defaultdict(list)
    for row in csv_data:
        data[row["id"]].append(row[None])

    # Convert dictionary to list, removing id keys
    final = [data[id] for id in data]
    print(final)

Вывод:

[[['1458216259', '41.152', '-8.628', 'car'], ['1458216298', '41.153', '-8.629', 'car'], ['1458216384', '41.154', '-8.629', 'car']], [['1458217610', '41.155', '-8.626', 'foot'], ['1458217657', '41.156', '-8.625', 'foot'], ['1458217658', '41.157', '-8.625', 'foot']]]
...