Как посчитать что-то из таблицы с помощью Python

Ivan @ 07 / 06 / 2020 @ Памятки / Программирование
( / / )

Время чтения: ~ 4 мин.

Вчера пришлось разобраться с одним заданием для одного воркшопа. В качестве задания была таблица вида:

Город Регион Федеральный округ Население Основание Статус города
1 Абаза Хакасия Сибирский 17111 1867 1966
2 Абакан Хакасия Сибирский 165183 1734 1931
3 Абдулино Оренбургская область Приволжский 20663 1795 1923
4 Абинск Краснодарский край Южный 34926 1863 1963
5 Агидель Башкортостан Приволжский 16365 1980 1991
6 Агрыз Татарстан Приволжский 19299 1646 1938

Задачу надо было решить на питоне в colab.research.google.com. Надо было посчитать, сколько городов в таблице основаны в 17 веке. Сложность была в том, что основание там указывалось в разном формате: где-то «16хх», где-то «XVII что-то».

Сначала накрутил какую-то мутную схему с двумя вложенными циклами и вознёй с питоновскими списками, и сравнением списка нужных дат со списком фактических дат. И всё это было адски громоздко, замудрёно, и тяжело для восприятия, особенно в контексте моего перехода с JS на Питон. Кроме того, список исключений — ещё та муть, который составлять было очень долго и некогда, поскольку это задание было выдано в последний момент перед дедлайном. А ещё мутно и на коленке написанные тетрадки от организаторов только ухудшали ситуацию. Конечно, как обычно, несмотря на то, что я уложился в дедлайн, и алгорим был верен, заявку отклонили, поскольку уже набрали группы. Ну это и к лучшему.

Зато потом, спустя полчаса, внезапно вспомнил про регулярные выражения, и код уменьшился втрое:

#from google.colab import files
import requests 
import re
import pandas as pd
data = pd.read_csv('cities.csv')

d = data ['Основание']
d = d.values.tolist()
number=len(re.findall(r"('16..')|(XVII\s)", str(d)))
print (number)

Тут подключаются библиотеки requests, re, pandas, files (впрочем, files — не нужны тут, поскольку именно работы с файлами на уровне потоков ввода/вывода тут не будет, эта строчка за каким-то рожном была предложена организаторами). Pandas — дают инструменты для гибкой работы с таблицами, re — regex. При этом, в пандавской функции read_csv можно задавать не только локальные пути к файлу, но и полные url c http/s. Осталось только воткнуть в метод re.findall r»(’16..’)|(XVII\s)» и перевести список в строку str(d) (findall принимает только строки вторым аргументом).


Может быть интересно:

Подпишитесь на нас в социальных сетях!

Instagram
VK
Facebook
YouTube!

Подпишитесь на обновления

* нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных