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

Telegram was co-founded by Pavel and Nikolai Durov, the brothers who had previously created VKontakte. VK is Russia’s equivalent of Facebook, a social network used for public and private messaging, audio and video sharing as well as online gaming. In January, SimpleWeb reported that VK was Russia’s fourth most-visited website, after Yandex, YouTube and Google’s Russian-language homepage. In 2016, Forbes’ Michael Solomon described Pavel Durov (pictured, below) as the “Mark Zuckerberg of Russia.” 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." The gold standard of encryption, known as end-to-end encryption, where only the sender and person who receives the message are able to see it, is available on Telegram only when the Secret Chat function is enabled. Voice and video calls are also completely encrypted. Some people used the platform to organize ahead of the storming of the U.S. Capitol in January 2021, and last month Senator Mark Warner sent a letter to Durov urging him to curb Russian information operations on Telegram. Telegram does offer end-to-end encrypted communications through Secret Chats, but this is not the default setting. Standard conversations use the MTProto method, enabling server-client encryption but with them stored on the server for ease-of-access. This makes using Telegram across multiple devices simple, but also means that the regular Telegram chats you’re having with folks are not as secure as you may believe.
from us


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