Извлечение дублирующих поездок из списка списков бронирования автобусов - PullRequest
0 голосов
/ 16 мая 2019

Я использую CSV-файл, извлеченный из базы данных шинных записей.Я хочу найти и сохранить из огромного списка все записи, которые соответствуют одному и тому же пользователю, идентифицированному одним и тем же идентификатором устройства.Существует около 300000 идентификаторов устройств, с 3-мя отключениями на устройство.Поэтому я хочу сгенерировать файл, который позволяет получить идентификатор устройства, найти все поездки, предпринятые пользователем, найти цену, дату и т. Д. За весь год.

Я пробовал использовать панд и заказыватьс помощью dict, но поскольку ключи имеют нестандартный формат, он генерирует ошибки.

with open('Salida1.csv',newline='', mode='r') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
#rows1 = list(csv_reader)
#print(len(rows1))
line_count = 0
for row in csv_reader:
    if line_count == 0:
        print(f'Column names are {", ".join(row)}')
        line_count += 1
    else:        
        mydict5ordenado.append(list(row))
        line_count += 1
print(f'Processed {line_count} lines.')
print(row)
print(mydict5ordenado[940000][20])

DeviceID находится в строке (20).

Имена столбцов: id, idapp, date_ws, date_time, date_departure, date_arrival, localizador, netPrice, insurancePrice, источник, среда, pay_pal, источник, пункт назначения, numPassengers, direction, busType, устройство, модель, версия, deviceID,tificationID, newBackOffice, devi

из mydict5ordenado Я должен быть в состоянии найти все записи, которые имеют повторяющиеся идентификаторы устройств и сохранить их в файле или в словаре.Например, mydictordenado[940000] содержит следующую информацию

['9265551', '5712', '2019-03-31', '2019-03-31 03:16:32', '2019-03-31
 18:15:00', '2019-03-31 19:45:00', '1dpyov0', '9.42', '0.00', 
'ANDROID_APP', 'PRO', '0', '344', '9084', '1', 'IDA', 'UNKNOWN', 'WAS-LX1A', 
'WAS-LX1A', '6.3.0', '60501c9494b01f78', '0', '2', '26', '0', '', '9103000011625750'

Мы хотим найти в файле все поездки, связанные с телефоном с идентификатором - 60501c9494b01f78.

1 Ответ

1 голос
/ 16 мая 2019

Вы можете использовать defaultdict для сбора строк для каждого идентификатора устройства в списке с идентификатором устройства в качестве ключа.

Примерно так должно работать:

import collections

devicedict = collections.defaultict(list)

with open('Salida1.csv',newline='', mode='r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    next(csv_reader)   # Skip header row
    for row in csv_reader:
        key = row[20]
        devicedict[key].append(row)

В этом примере defaultdict:

>>> d
defaultdict(<class 'list'>, {'A': [['A', 1, 2], ['A', 5, 6]], 'B': [['B', 4, 5]]})

Чтобы найти устройство с наибольшим количеством поездок:

>>> max(d.items(), key=lambda i: len(i[1]))
('A', [['A', 1, 2], ['A', 5, 6]])

A defaultdict не подлежит заказу, но вы можетесоздайте collection.OrderedDict , упорядоченный по количеству поездок:

>>> od = collections.OrderedDict(sorted(d.items(), key=lambda i: len(i[1])))
>>> od
OrderedDict([('B', [['B', 4, 5]]), ('A', [['A', 1, 2], ['A', 5, 6]])])

Если ваш код работает на Python 3.7+, вы можете использовать обычный dict вместо OrderedDict:

>>> dict(sorted(d.items(), key=lambda i: len(i[1])))
{'B': [['B', 4, 5]], 'A': [['A', 1, 2], ['A', 5, 6]]}

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

>>> max(d.values(), key=len)
[['A', 1, 2], ['A', 5, 6]]

>>> sorted(d.values(), key=len)
[[['B', 4, 5]], [['A', 1, 2], ['A', 5, 6]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...