Признаюсь честно, я не люблю читать документацию к библиотекам в питоне. Что поделаешь, сухое описание «вот этот параметр отвечает за это» и простенькие примеры не откладываются у меня в голове.
Но незнание некоторых особенностей методов иногда приводит меня к факапам (даже с простейшими функциями) и попыткам изобрести велосипед.🤡
📌 Лот первый - df.info()
Базовый метод, показывает структуру датафрейма, я юзаю его практически после каждого изменения в df для проверки всё ли идёт по плану. Помимо количества строк и столбцов, типа данных и проверки на нулевые / ненулевые значения может показывать используемую память.
Недавно у меня была задача по заливке датафрейма в озеро данных. Чуйка (и здравый смысл вообще-то 😎, ведь датафрейм формировала я) подсказывала мне, что объём данных может уронить мне этот процесс. Но df.info показал, что моё детище весит всего плюс-минус 250 МБ. И отправив на выполнение запрос на запись, спустя n секунд я словила ошибку OutOfMemoryError.🤯
Оказалось, что даже в таком простом методе есть параметры, и один из них очень полезен при работе с ёмкими столбцами - memory_usage:
📝 memory_usage=False - отключает вывод данных о памяти (удобно, когда датафрейм большой и нужно быстро увидеть всю остальную инфо);
📝 memory_usage=True (по-умолчанию) - показывает объём памяти, который занимают данные в столбцах и ссылки на них (для строковых колонок учитывается только место под ссылку на каждую строку, а не размер самого текста);
📝 memory_usage='deep' - считает реальный объём памяти, включая весь текст в строковых колонках, данные категорий и даты.
У меня был как раз датафрейм с текстовыми столбцами. После перевыполнения ячейки с memory_usage='deep' оказалось, что датафрейм весит 5,3 ГБ.🥴
Теперь понимаю, сколько раз ошибалась, видя, что датафрейм весит вроде не так уж много, но процессы почему-то тормозят. Как говорится:
- Как у вас получаются такие хорошие показатели?
- Мы просто неправильно считаем
🫣
📌Лот второй - df.value_counts()
Пример ещё одного полезного, но долго остававшегося для меня в тени параметра - normalize.
value_counts - быстрый «счётчик частот» в pandas. Показывает, сколько раз встречается каждое уникальное значение в серии или столбце таблицы. По умолчанию считает абсолютные значения, а вот при использовании normalize=True позволяет перейти к относительным (доли от общего числа).
Раньше, когда нужно было быстро прикинуть проценты, я напрягала извилины😡, чтобы хотя бы примерно посчитать, сколько же там составляют группы относительно друг друга (если было лень считать нормально). Теперь юзаю normalize, в том числе уже пару раз пригодилось мне на собесах.
df['column'].value_counts(normalize=True).round(2) * 100
(еще у value_counts есть параметр bins, который делит данные на примерно равные по ширине интервалы и показывает количество значений внутри них, но мне пока ни разу не пригождалось сие знание)
Остаётся только вопрос - как узнавать о таких простых и нужных вещах? 🙄 Лично мне в голову никогда бы не пришло загуглить, как посчитать проценты в пандасе, ведь я и так могла бы это сделать в пару действий.