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: |

In addition, Telegram now supports the use of third-party streaming tools like OBS Studio and XSplit to broadcast live video, allowing users to add overlays and multi-screen layouts for a more professional look. Russian President Vladimir Putin launched Russia's invasion of Ukraine in the early-morning hours of February 24, targeting several key cities with military strikes. "He has to start being more proactive and to find a real solution to this situation, not stay in standby without interfering. It's a very irresponsible position from the owner of Telegram," she said. The Dow Jones Industrial Average fell 230 points, or 0.7%. Meanwhile, the S&P 500 and the Nasdaq Composite dropped 1.3% and 2.2%, respectively. All three indexes began the day with gains before selling off. But because group chats and the channel features are not end-to-end encrypted, Galperin said user privacy is potentially under threat.
from us


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