Применение пользовательских функций в Pandas

Как модифицировать данные с помощью встроенных и пользовательских функций в Pandas

Работа с данными в Pandas иногда требует специфических преобразований, которые не реализованы стандартными методами. Для этого можно применять пользовательские функции. В Pandas есть удобный метод apply(), который позволяет применять любую функцию к данным.

Основы метода apply()

Метод apply() можно использовать как для DataFrame, так и для Series.

Пример на Series:

import pandas as pd

s = pd.Series([1, 2, 3, 4])
s_squared = s.apply(lambda x: x**2)
print(s_squared)

# 0     1
# 1     4
# 2     9
# 3    16
# dtype: int64

Пример на DataFrame:

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

# Применяем функцию ко всем элементам DataFrame
df_squared = df.apply(lambda x: x**2)
print(df_squared)

#    A   B
# 0  1  16
# 1  4  25
# 2  9  36

Что такое lambda-функции

В примерах выше была использована lambda-функция. Это анонимная функция, объявленная с помощью ключевого слова lambda. Она может иметь любое количество аргументов, но только одно выражение.

Пример:

f = lambda x: x + 10
print(f(5))  # Выведет 15

Применение apply() с аргументами

Метод apply() позволяет передавать дополнительные аргументы в функцию:

s = pd.Series([1, 2, 3, 4])

def multiplier(x, factor):
    return x * factor

s_multiplied = s.apply(multiplier, factor=3)
print(s_multiplied)

# 0     3
# 1     6
# 2     9
# 3    12
# dtype: int64

Применение функций по строкам или столбцам DataFrame

По умолчанию apply() применяется к столбцам DataFrame. Однако можно изменить это поведение, передав аргумент axis.

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

# Применение функции к строкам
summed = df.apply(sum, axis=1)
print(summed)

# 0     3
# 1     6
# 2     9
# 3    12
# dtype: int64

Возвращение нескольких столбцов

Функция, переданная в apply(), может возвращать несколько значений, которые затем преобразуются в DataFrame.

df = pd.DataFrame({
    'fullname': ['John Smith', 'Jane Doe']
})

def split_name(name):
    first, last = name.split()
    return pd.Series((first, last), index=['first_name', 'last_name'])

names = df['fullname'].apply(split_name)
print(names)

#   first_name last_name
# 0       John     Smith
# 1       Jane       Doe

Комбинирование apply() и других методов

Вы можете комбинировать apply() с другими методами Pandas для создания сложных вычислительных цепочек.

# Нахождение максимального значения в каждом столбце, затем его квадрат
max_squared = df.apply(max).apply(lambda x: x**2)

Использование нескольких аргументов с lambda

Вы можете использовать lambda с несколькими аргументами, особенно полезно при работе с методом apply() для DataFrame.

df = pd.DataFrame({
    'Length': [5, 6, 7],
    'Width': [8, 9, 10]
})

df['Area'] = df.apply(lambda row: row['Length'] * row['Width'], axis=1)
print(df)

Заключение

Метод apply() и lambda-функции дают громадную гибкость при работе с данными в Pandas. Используя их, вы можете легко создавать кастомные функции и применять их к вашим данным для получения необходимых результатов. Однако следует быть аккуратным: чрезмерное использование apply() может сделать код менее читаемым и менее эффективным по производительности. Но в умелых руках это мощный инструмент.

Содержание: