blog/
Как посчитать что-то из таблицы с помощью Python
Вчера пришлось разобраться с одним заданием для одного воркшопа. В качестве задания была таблица вида:
№ | Город | Регион | Федеральный округ | Население | Основание | Статус города |
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 принимает только строки вторым аргументом).
Может быть интересно:
- Скрипт для выбора победителя в инстаграме (из лайков)
- Про Python и ArchiCAD: удалить лишние слои
- Задаём свойства объектам в ArchiCAD 23 через Python
- Select all images urls and download them
- Скрипт для выбора победителя в инстаграме (из комментариев)