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

The Security Service of Ukraine said in a tweet that it was able to effectively target Russian convoys near Kyiv because of messages sent to an official Telegram bot account called "STOP Russian War." In addition, Telegram's architecture limits the ability to slow the spread of false information: the lack of a central public feed, and the fact that comments are easily disabled in channels, reduce the space for public pushback. In a message on his Telegram channel recently recounting the episode, Durov wrote: "I lost my company and my home, but would do it again – without hesitation." As a result, the pandemic saw many newcomers to Telegram, including prominent anti-vaccine activists who used the app's hands-off approach to share false information on shots, a study from the Institute for Strategic Dialogue shows. One thing that Telegram now offers to all users is the ability to “disappear” messages or set remote deletion deadlines. That enables users to have much more control over how long people can access what you’re sending them. Given that Russian law enforcement officials are reportedly (via Insider) stopping people in the street and demanding to read their text messages, this could be vital to protect individuals from reprisals.
from jp


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