Метод transform
Метод transform применяется к объекту GroupBy
и возвращает объект той же формы, что и исходные данные.
В отличие от agg, который сворачивает группы, transform
сохраняет индекс и позволяет транслировать результаты групповых операций
обратно на каждую строку. Первым параметром передаётся функция,
которая применяется к каждой группе.
Синтаксис
df.groupby(by).transform(func, *args, **kwargs)
Пример
Допустим, у нас есть таблица с группами, и мы хотим вычислить среднее значение для каждой группы и записать его в новый столбец:
import pandas as pd
df = pd.DataFrame({
'a': [1, 1, 2, 2, 3],
'b': [10, 20, 30, 40, 50]
})
df['mean_b'] = df.groupby('a')['b'].transform('mean')
print(df)
Результат выполнения кода:
a b mean_b
0 1 10 15.0
1 1 20 15.0
2 2 30 35.0
3 2 40 35.0
4 3 50 50.0
Пример
Используем собственную функцию для преобразования. Вычтем из каждого значения групповое среднее:
import pandas as pd
df = pd.DataFrame({
'a': [1, 1, 2, 2, 3],
'b': [10, 20, 30, 40, 50]
})
df['b_centered'] = df.groupby('a')['b'].transform(
lambda x: x - x.mean()
)
print(df)
Результат выполнения кода:
a b b_centered
0 1 10 -5.0
1 1 20 5.0
2 2 30 -5.0
3 2 40 5.0
4 3 50 0.0
Пример
Метод transform также умеет работать с несколькими столбцами.
Применим функцию к целой группе:
import pandas as pd
df = pd.DataFrame({
'a': [1, 1, 2, 2, 3],
'b': [10, 20, 30, 40, 50],
'c': [100, 200, 300, 400, 500]
})
df_grouped = df.groupby('a').transform(lambda x: x / x.sum())
print(df_grouped)
Результат выполнения кода:
b c
0 0.333333 0.333333
1 0.666667 0.666667
2 0.428571 0.428571
3 0.571429 0.571429
4 1.000000 1.000000