Работа с данными в Pandas иногда требует специфических преобразований, которые не реализованы стандартными методами. Для этого можно применять пользовательские функции. В Pandas есть удобный метод 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
. Она может иметь любое количество аргументов, но только одно выражение.
Пример:
f = lambda x: x + 10
print(f(5)) # Выведет 15
Метод 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
По умолчанию 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()
с другими методами Pandas для создания сложных вычислительных цепочек.
# Нахождение максимального значения в каждом столбце, затем его квадрат
max_squared = df.apply(max).apply(lambda x: x**2)
Вы можете использовать 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()
может сделать код менее читаемым и менее эффективным по производительности. Но в умелых руках это мощный инструмент.
Содержание: