Парсим CSV-файл

Файлы в формате csv представляют собой текстовое представление данных таблицы. Как правило, строки таблицы в таком файле соответствуют строкам с данными ячеек через разделитель — запятую. В первой строке файла содержится заголовок таблицы с перечисленными через разделитель (запятую) названиями столбцов. В качестве разделителя может быть использован и другой символ. Его можно указать при считывании данных. Итак, парсим CSV файл.

В Python для работы с форматом csv есть одноименная библиотека, которую и подключим в первой строке кода. Далее считаем все данные из файла <Crimes.csv> методом csv.reader, поместим их в переменную data и выведем первые 5 строк (код ниже):

import csv

with open('Crimes.csv', newline='') as f:
    data = csv.reader(f)
    i = 0
    for row in data:
        print(row)
        i += 1
        if i == 5:
            break

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

['ID', 'Case Number', 'Date', 'Block', 'IUCR', 'Primary Type', 'Description', 'Location Description', 'Arrest', 'Domestic', 'Beat', 'District', 'Ward', 'Community Area', 'FBI Code']
['2383135', 'HH684629', '10/01/2002 12:47:08 PM', '032XX W ROOSEVELT RD', '0860', 'THEFT', 'RETAIL THEFT', 'GROCERY FOOD STORE', 'true', 'false', '1134', '011', '24', '29', '06']
['2383437', 'HH693227', '09/04/2002 09:30:00 PM', '048XX W ARMITAGE AVE', '0486', 'BATTERY', 'DOMESTIC BATTERY SIMPLE', 'TAVERN/LIQUOR STORE', 'false', 'true', '2522', '025', '31', '19', '08B']
['2383482', 'HH692935', '10/04/2002 10:09:09 PM', '116XX S MICHIGAN AVE', '1330', 'CRIMINAL TRESPASS', 'TO LAND', 'GAS STATION', 'true', 'false', '0532', '005', '9', '53', '26']
['2383568', 'HH690681', '10/03/2002 05:00:00 AM', '017XX W TOUHY AVE', '0610', 'BURGLARY', 'FORCIBLE ENTRY', 'APARTMENT', 'false', 'false', '2423', '024', '49', '1', '05']

В качестве примера определим тип преступления, которое было зафиксировано максимальное число раз в 2015 году. Во 2 элементе (считаем с 0) строк данных содержится дата: ’10/01/2002 12:47:08 PM’. Выделим год из этой подстроки и сравним с ‘2015’. При совпадении значение 5 элемента (считаем с 0), в котором и содержится тип преступления добавляем в список primary_types.

import csv

primary_types = []
with open('Crimes.csv', newline='') as f:
    data = csv.reader(f)
    i = 0
    for row in data:
        if i < 5:
            print(row)
        if i > 0 and row[2][6:10] == '2015':
            primary_types.append(row[5])
        i += 1
print(primary_types) 
d = dict()
for p_type in primary_types:
    d[p_type] = d.get(p_type, 0) + 1
print(d)
   
res = sorted(d.items(), key=lambda item : item[1], reverse=True)
print(res)

print(res[0][0])

Для контроля давайте выведем список из названий преступлений — primary_types :

['NARCOTICS', 'BATTERY', 'CRIMINAL DAMAGE', 'ASSAULT', 'BATTERY', 'BATTERY', 'BATTERY', 'DECEPTIVE PRACTICE', 'NARCOTICS', 'BATTERY', 'CRIMINAL DAMAGE', 'THEFT', 'BATTERY', 'BATTERY', 'ROBBERY', 'NARCOTICS', 'NARCOTICS', 'INTERFERENCE WITH PUBLIC OFFICER', 'PROSTITUTION', 'BATTERY', 'BATTERY', 'THEFT', 'CRIMINAL TRESPASS', ...] 

Далее посчитаем типы преступлений в цикле используя словарь, где ключи — типы преступлений, а значения — число этих преступлений. Встречая название преступления очередной раз в словаре увеличиваем значение их числа. Для контроля выведем полученный словарь :

{'NARCOTICS': 254, 'BATTERY': 473, 'CRIMINAL DAMAGE': 297, 'ASSAULT': 175, 'DECEPTIVE PRACTICE': 140, 'THEFT': 596, 'ROBBERY': 88, 'INTERFERENCE WITH PUBLIC OFFICER': 13, 'PROSTITUTION': 14, 'CRIMINAL TRESPASS': 64, 'BURGLARY': 132, 'OTHER OFFENSE': 179, 'PUBLIC PEACE VIOLATION': 28, 'MOTOR VEHICLE THEFT': 123, 'OFFENSE INVOLVING CHILDREN': 18, 'WEAPONS VIOLATION': 28, 'CRIM SEXUAL ASSAULT': 17, 'INTIMIDATION': 2, 'SEX OFFENSE': 9, 'KIDNAPPING': 2, 'STALKING': 2, 'GAMBLING': 2, 'LIQUOR LAW VIOLATION': 4, 'ARSON': 3, 'HOMICIDE': 5}

Осталось отсортировать полученный словарь по его значениям по убыванию (reverse=True) и вывести ключ 0 элемента — тип преступления, совершённого максимальное число раз. В качестве функции сортировки используем lambda-выражение, чтобы сортировка была по числу преступлений. Результат сортировки и собственно максимум приведен ниже :

[('THEFT', 596), ('BATTERY', 473), ('CRIMINAL DAMAGE', 297), ('NARCOTICS', 254), ('OTHER OFFENSE', 179), ('ASSAULT', 175), ('DECEPTIVE PRACTICE', 140), ('BURGLARY', 132), ('MOTOR VEHICLE THEFT', 123), ('ROBBERY', 88), ('CRIMINAL TRESPASS', 64), ('PUBLIC PEACE VIOLATION', 28), ('WEAPONS VIOLATION', 28), ('OFFENSE INVOLVING CHILDREN', 18), ('CRIM SEXUAL ASSAULT', 17), ('PROSTITUTION', 14), ('INTERFERENCE WITH PUBLIC OFFICER', 13), ('SEX OFFENSE', 9), ('HOMICIDE', 5), ('LIQUOR LAW VIOLATION', 4), ('ARSON', 3), ('INTIMIDATION', 2), ('KIDNAPPING', 2), ('STALKING', 2), ('GAMBLING', 2)]

максимум : THEFT

Для понимания процесса решения всё расписано подробно. Мы парсим CSV файл для получения конкретного значения. Если покопаться в приведённых данных, можно определить и другие не менее интересные факты. В каждом конкретном случае нужно изучить представленные данные. С помощью сортировки и подсчётов решается практически любая задача. Иногда может быть и сложно, но не боги горшки обжигают !

Обновлено: 29.10.2022 — 17:31

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *