Короткий ответ
transform возвращает результат той же формы, что и исходные данные (по одному значению на каждую исходную строку, "размноженному" внутри группы), а apply может возвращать результат произвольной формы, включая свёрнутый до одной строки на группу.
Как это работает подробнее
transform применяет функцию к каждой группе и "растягивает" результат обратно на все строки этой группы, что удобно для добавления группового значения (например, среднего по группе) как нового столбца исходной таблицы без явного merge; apply более гибок, но менее предсказуем по форме результата и часто медленнее.
Пример кода
question-125.py
import pandas as pd
df = pd.DataFrame({'group': ['A', 'A', 'B', 'B'], 'value': [10, 20, 5, 15]})
df['group_mean'] = df.groupby('group')['value'].transform('mean')
print(df)Что использовать на практике
- Практика. typичный кейс для transform — "вычесть из каждой строки среднее значение её группы" (df['dev'] = df['x'] - df.groupby('g')['x'].transform('mean')); apply уместен, когда логика агрегации сложнее, чем единая функция, применимая колоночно, например, если внутри группы нужно вернуть несколько связанных статистик сразу.
- Проверка. для группы A group_mean должен быть 15 в обеих строках, для группы B — 10 в обеих строках, при этом число строк в df не изменилось.
Подводные камни
- Частая ошибка. используют apply там, где можно обойтись transform, теряя производительность на больших данных; ожидают от transform изменения числа строк (например, возврата одной строки на группу), хотя по определению transform сохраняет исходную форму данных.