Фабрика DataFrames 🐼
318 subscribers
6 photos
1 link
Сообщество аналитиков и инженеров данных на Python. Короткие и мощные хитрости в Pandas для быстрого анализа и автоматизации рутины ждут в канале. Присоединяйся и начни экономить время уже сегодня!
Download Telegram
Сообщество аналитиков и инженеров данных, где ты найдёшь множество интересных трюков, лайфхаков и глубоких инсайтов по работе с Pandas в Python. Всё, что нужно, чтобы усвоить мощь библиотек для анализа данных и автоматизировать рутинные задачи.

От автора лучших курсов по Pandas на Stepik:

⭐️ Основы Pandas для начинающих
https://stepik.org/a/120014

⭐️ Практикум по Pandas
https://stepik.org/a/111629
🤩78🥰77👍65🔥51🎉5041👏40
⚡️Добавляйте новые столбцы «на лету», используя метод assign().

Например, если вам нужно сразу создать несколько новых колонок, можно сделать это в одной цепочке.Так вы сможете избежать многочисленных присваиваний и сделать код чище и понятнее.

#лайфхак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143🎉86🤩8171🥰68🔥35👏19
⚡️Для удобной фильтрации данных вместо классического:
df[(df['col1'] == 1) & (df['col2'] == 2)]


можно использовать метод query():
df.query('col1 == 1 & col2 == 2')


Так код получается короче и легче читается.

#лайфхак
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥83🤩73🥰72👏6756🎉42👍38
⚡️Если нужно вычислить статистику и записать её в каждый элемент группы, воспользуйтесь transform().

Так каждый элемент в группе получит среднее значение по своей группе в новом столбце.
Было:
group_col target_col
0 A 10
1 A 20
2 B 30
3 B 40
4 B 50

Станет:
group_col target_col mean_value
0 A 10 15.0
1 A 20 15.0
2 B 30 40.0
3 B 40 40.0
4 B 50 40.0


#лайфхак
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰84🎉83🤩67🔥5647👍46👏41
⚡️Если в одной ячейке хранится список значений, а вам нужен отдельный ряд для каждого элемента, используйте метод explode():
df.explode('list_column')


Так можно «развернуть» списки в столбце в отдельные строки.
Было:
id list_column
0 1 [10, 20, 30]
1 2 [40, 50]

Станет:
id list_column
0 1 10
0 1 20
0 1 30
1 2 40
1 2 50


#лайфхак
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉200🔥98👍96🤩61🥰5948👏32
⚡️Используйте метод pipe(), чтобы связать несколько нестандартных преобразований DataFrame в одну цепочку, сохраняя код чистым и читаемым.
import pandas as pd

# Исходный DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4],
'B': [10, 20, 30, 40]
})

# Наша функция: умножаем столбец 'A' на 2
def multiply_A(data):
data['A'] = data['A'] * 2
return data

# Применяем pipe: сначала умножаем 'A', затем создаём новый столбец 'C' как сумму 'A' и 'B'
df = (df
.pipe(multiply_A)
.pipe(lambda d: d.assign(C=d['A'] + d['B'])))

Так можно элегантно комбинировать несколько операций без временных переменных.

#лайфхак
Please open Telegram to view this post
VIEW IN TELEGRAM
👏134🎉129🥰86👍52🤩5143🔥43
⚡️Иногда DataFrame оказывается неожиданно «тяжёлым», и вы начинаете замечать снижение скорости или недостаток памяти. Чтобы найти самые «прожорливые» колонки:
# Предположим, что в df есть колонки A, B, C, тогда
mem_info = df.memory_usage(deep=True) / (1024**2)

print(mem_info.round(2))

Результат:

Index 1.00 # индекс 1 МБ
A 0.40 # 400 КБ
B 3.00 # 3 МБ
C 0.00 # менее 50 КБ
dtype: float64


Теперь легко увидеть в мегабайтах, какой столбец требует больше всего ресурсов и при необходимости оптимизировать его (например, перевести строки в category).

Подумайте и напишите, почему мы делим на (1024**2) и что делать, если хочется вывести в килобайтах или гигабайтах?

#лайфхак
Please open Telegram to view this post
VIEW IN TELEGRAM
👏97🥰89🔥72👍61🤩61🎉5545
☄️ Сейчас в Pandas есть интересный баг с корреляцией Пирсона

Возможно вы помните, что коэффициент лежит в интервале [-1, 1]. Но если вы считаете корреляцию через corr(), то рискуете получить некорректный результат:
data = pd.DataFrame(dict(
x=[0, 1],
y=[1.35951, 1.3595100000000007]
))
data.corr()

    x      y
x 1 1.15
y 1.15 1


Как видите - корреляция между x и y равна 1.15, но как такое получилось?

Это происходит из-за маленьких неточностей (ошибок округления), которые накапливаются при операциях с числами с плавающей точкой. А вот corrcoef из numpy в этом случае приводит коэффициент к границе интервала
np.corrcoef(data)

array([[1., 1.],
[1., 1.]])


В целом ничего страшного, просто учтите, что такое может быть из-за бага. Кстати, исправление должно быть включено ближайшее обновление, а пока будьте внимательны 👀
Please open Telegram to view this post
VIEW IN TELEGRAM
👍125123🥰77🤩73👏54🔥51🎉48
This media is not supported in the widget
VIEW IN TELEGRAM
🥰190🔥107🤩90🎉8051👍30👏10😡1
🔥 Самый популярный вопрос про Pandas на StackOverflow, который набрал более 7 млн просмотров и более 3х тысяч голосов:

How can I iterate over rows in a Pandas DataFrame?
(Как я могу пройтись по строкам датафрейма?)

Классический вопрос об итерации по строкам DataFrame. Несмотря на то, что прямой обход строк не рекомендуется из-за низкой скорости, этот вопрос набрал рекордное число просмотров и голосов.

Да, при работе с DataFrame иногда нужно обойти строки для выполнения отдельных операций. Один из простых способов – использовать метод iterrows(), который возвращает индекс и строку в виде Series.

Однако для больших датафреймов лучше использовать itertuples() или векторизированные операции для оптимизации скорости
Please open Telegram to view this post
VIEW IN TELEGRAM
👏146🤩101🥰84👍75🎉7059🔥46
📣 Несколько любопытных фактов про Pandas

Библиотека была создана Уэсом МакКинни (Wes McKinney) около 2008 года, когда он работал в хедж-фонде AQR. Ему требовался удобный инструмент для быстрой и гибкой работы с данными в Python, особенно с табличными (как в Excel) и временными рядами 📈, поэтому он начал разрабатывать pandas как внутренний проект.

💡 Почему «Pandas»?
Название происходит не столько от симпатичного медведя, сколько от сочетания слов panel data (термин в эконометрике для многомерных временных рядов), и Python data analysis (Python для анализа данных).

💡 Как всё началось:
Изначально это был закрытый корпоративный инструмент, но вскоре Уэс МакКинни решил открыть исходный код, чтобы помочь Python-сообществу в анализе данных.

Получается, что за милым названием pandas стоит серьёзная эконометрическая основа и практические нужды хедж-фонда, а «медвежья» ассоциация оказалась просто приятным бонусом, который легко запоминается🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉127👍105🤩102🔥86🥰64👏3330
🚨 Обращаете ли вы внимание на предупреждения при работе с датафреймами?

SettingWithCopy в Pandas — это предупреждение, возникающее, когда ты пытаешься изменить фрагмент датафрейма, и непонятно, изменится ли оригинал или только его копия.

Я же работал в отдельном датафрейме, почему мои данные изменились в исходном датафрейме тоже? 👀

Представь такую ситуацию:
Ты берёшь кусочек большой таблицы и меняешь значения в нём:
df_small = df_big[df_big['A'] > 5]
df_small['B'] = 100


Pandas не может понять, хочешь ли ты изменить только кусочек отдельно или изменить исходную таблицу. Поэтому возникает предупреждение:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.


Оно говорит тебе:
Ты точно хочешь изменить этот кусок отдельно? Или хотел поменять исходную таблицу?


Это предупреждение важно, потому что часто неясно, работаешь ты с копией (отдельным объектом в памяти) или представлением (view — ссылается на те же данные). Поведение зависит от внутренней реализации Pandas и устройства памяти твоего датафрейма, что делает результат неочевидным и непредсказуемым для нас 👀

Почему это проблема?
- Если это копия, то изменения никак не повлияют на исходный датафрейм.
- Если это представление (view), то изменения применятся и к исходной таблице тоже ‼️

Без явного указания, что именно ты хочешь сделать, Pandas теряется, а это может привести к неожиданным ошибкам.

Как избежать SettingWithCopy?
Самое простое и правильное решение — явно указать Pandas, что ты хочешь делать копию данных:
df_small = df_big[df_big['A'] > 5].copy()
df_small['B'] = 100


Используя .copy(), ты чётко показываешь, что хочешь создать отдельную копию, и Pandas больше не будет показывать предупреждения.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩143🥰107100🔥89🎉83👍68👏34