Telegram Group & Telegram Channel
🐼 Pandas-задача с подвохом: “Почему ничего не работает?”

📘 Условие

Дано: DataFrame df:


import pandas as pd
import numpy as np

df = pd.DataFrame({
'user_id': [1, 1, 2, 2, 3, 3],
'score': [100, 90, np.nan, 85, 75, 95]
})


Ты хочешь:

1) Для каждого пользователя найти средний score,
2) Заполнить пропущенные значения score средним по этому пользователю.

Ты пишешь код:


df['score_filled'] = df.groupby('user_id')['score'].apply(lambda x: x.fillna(x.mean()))


Ожидаешь, что пропущенное значение будет заменено на `85.0`.
Но вместо этого… возникает ошибка или неверный результат.

Вопрос:

1) Почему этот код не работает как ты ожидаешь?
2) Какое поведение apply() вызывает подвох?
3) Как правильно решить задачу?

---

Разбор:

💥 Проблема в `.apply()` + присваивание по индексу

Функция `groupby().apply()` возвращает **объединённый результат с вложенным индексом**, который **не совпадает с индексом исходного DataFrame**.

Пример:

```python
df.groupby('user_id')['score'].apply(lambda x: x.fillna(x.mean()))
```

→ возвращает Series с уровнем индекса: `(user_id, original_index)`,
а `df['score_filled'] = ...` ожидает индекс, совпадающий с `df.index`.

📌 Результат: pandas либо выбрасывает `ValueError`, либо вставляет неправильные значения.

Правильные способы

Способ 1: использовать `transform` (индекс сохраняется!):

```python
df['score_filled'] = df['score'].fillna(
df.groupby('user_id')['score'].transform('mean')
)
```

Способ 2: в два шага:

```python
user_means = df.groupby('user_id')['score'].transform('mean')
df['score_filled'] = df['score']
df.loc[df['score'].isna(), 'score_filled'] = user_means
```

🎯 Так `NaN` будет корректно заполнен значением `85.0`.

⚠️ Подвох

• `groupby().apply()` не гарантирует совпадение индексов
• `transform()` — безопаснее, если хочешь сохранить структуру
• Даже опытные часто используют `apply` “по привычке” и попадают в ловушку
• Такие ошибки не всегда приводят к crash — они хуже: создают **тихие баги**



Хочешь сделать вторую часть , ставь 👍



group-telegram.com/data_analysis_ml/3555
Create:
Last Update:

🐼 Pandas-задача с подвохом: “Почему ничего не работает?”

📘 Условие

Дано: DataFrame df:


import pandas as pd
import numpy as np

df = pd.DataFrame({
'user_id': [1, 1, 2, 2, 3, 3],
'score': [100, 90, np.nan, 85, 75, 95]
})


Ты хочешь:

1) Для каждого пользователя найти средний score,
2) Заполнить пропущенные значения score средним по этому пользователю.

Ты пишешь код:


df['score_filled'] = df.groupby('user_id')['score'].apply(lambda x: x.fillna(x.mean()))


Ожидаешь, что пропущенное значение будет заменено на `85.0`.
Но вместо этого… возникает ошибка или неверный результат.

Вопрос:

1) Почему этот код не работает как ты ожидаешь?
2) Какое поведение apply() вызывает подвох?
3) Как правильно решить задачу?

---

Разбор:

💥 Проблема в `.apply()` + присваивание по индексу

Функция `groupby().apply()` возвращает **объединённый результат с вложенным индексом**, который **не совпадает с индексом исходного DataFrame**.

Пример:

```python
df.groupby('user_id')['score'].apply(lambda x: x.fillna(x.mean()))
```

→ возвращает Series с уровнем индекса: `(user_id, original_index)`,
а `df['score_filled'] = ...` ожидает индекс, совпадающий с `df.index`.

📌 Результат: pandas либо выбрасывает `ValueError`, либо вставляет неправильные значения.

Правильные способы

Способ 1: использовать `transform` (индекс сохраняется!):

```python
df['score_filled'] = df['score'].fillna(
df.groupby('user_id')['score'].transform('mean')
)
```

Способ 2: в два шага:

```python
user_means = df.groupby('user_id')['score'].transform('mean')
df['score_filled'] = df['score']
df.loc[df['score'].isna(), 'score_filled'] = user_means
```

🎯 Так `NaN` будет корректно заполнен значением `85.0`.

⚠️ Подвох

• `groupby().apply()` не гарантирует совпадение индексов
• `transform()` — безопаснее, если хочешь сохранить структуру
• Даже опытные часто используют `apply` “по привычке” и попадают в ловушку
• Такие ошибки не всегда приводят к crash — они хуже: создают **тихие баги**



Хочешь сделать вторую часть , ставь 👍

BY Анализ данных (Data analysis)


Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260

Share with your friend now:
group-telegram.com/data_analysis_ml/3555

View MORE
Open in Telegram


Telegram | DID YOU KNOW?

Date: |

"Markets were cheering this economic recovery and return to strong economic growth, but the cheers will turn to tears if the inflation outbreak pushes businesses and consumers to the brink of recession," he added. Since January 2022, the SC has received a total of 47 complaints and enquiries on illegal investment schemes promoted through Telegram. These fraudulent schemes offer non-existent investment opportunities, promising very attractive and risk-free returns within a short span of time. They commonly offer unrealistic returns of as high as 1,000% within 24 hours or even within a few hours. Unlike Silicon Valley giants such as Facebook and Twitter, which run very public anti-disinformation programs, Brooking said: "Telegram is famously lax or absent in its content moderation policy." READ MORE "There are several million Russians who can lift their head up from propaganda and try to look for other sources, and I'd say that most look for it on Telegram," he said.
from us


Telegram Анализ данных (Data analysis)
FROM American