Метод apply
Метод apply применяется к объекту GroupBy
и позволяет применить пользовательскую функцию
к каждой группе данных. Первым параметром
передается функция, которая принимает DataFrame
или Series для каждой группы и возвращает
преобразованные данные. Метод может возвращать
как скалярное значение, так и DataFrame
или Series.
Синтаксис
grouped.apply(func, *args, **kwargs)
Пример
Давайте применим функцию для вычисления размаха значений в каждой группе:
import pandas as pd
df = pd.DataFrame({
'a': [1, 1, 2, 2, 3],
'b': [10, 20, 30, 40, 50]
})
grouped = df.groupby('a')
res = grouped.apply(lambda x: x['b'].max() - x['b'].min())
print(res)
Результат выполнения кода:
a
1 10
2 10
3 0
dtype: int64
Пример
Давайте применим функцию, которая возвращает
DataFrame для каждой группы:
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]
})
grouped = df.groupby('a')
def normalize_group(group):
return (group - group.min()) / (group.max() - group.min())
res = grouped.apply(normalize_group)
print(res)
Результат выполнения кода:
b c
0 0.0 0.0
1 1.0 1.0
2 0.0 0.0
3 1.0 1.0
4 0.0 0.0
Пример
Давайте применим функцию, которая возвращает дополнительную статистику для каждой группы:
import pandas as pd
df = pd.DataFrame({
'a': ['x', 'x', 'y', 'y', 'z'],
'b': [1, 2, 3, 4, 5],
'c': [10, 20, 30, 40, 50]
})
grouped = df.groupby('a')
def stats(group):
return pd.DataFrame({
'count': [len(group)],
'mean_b': [group['b'].mean()],
'mean_c': [group['c'].mean()]
})
res = grouped.apply(stats)
print(res)
Результат выполнения кода:
count mean_b mean_c
a
x 0 2 1.5 15.0
y 0 2 3.5 35.0
z 0 1 5.0 50.0
Пример
Давайте передадим дополнительные аргументы в функцию apply:
import pandas as pd
df = pd.DataFrame({
'a': [1, 1, 2, 2, 3],
'b': [10, 20, 30, 40, 50]
})
grouped = df.groupby('a')
def add_value(group, value):
return group + value
res = grouped.apply(add_value, value=10)
print(res)
Результат выполнения кода:
a b
0 11 20
1 11 30
2 12 40
3 12 50
4 13 60