Создание нового столбца через функцию в pandas DataFrame
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Если вам нужно быстро добавить новый столбец в pandas, применяя функцию к значениям других столбцов, можно использовать комбинацию apply
и lambda
. Например:
df['new_col'] = df.apply(lambda x: my_func(x['col1'], x['col2']), axis=1)
Здесь my_func
– это ваша функция, а col1
и col2
– столбцы, содержащиеся в DataFrame. Эта строка кода создаст новый столбец new_col
, состоящий из результатов применения функции my_func
.
Операции поэлементного преобразования
Для выполнения поэлементных операций необязательно строить сложные конструкции. Достаточно использовать простые математические операции:
df['new_col'] = df['col1'] * df['col2'] # Пример умножения
Высокая производительность благодаря векторизации в numpy
Векторизация функций с помощью numpy позволяет значительно повысить производительность. Ваша функция становится мощным стремительным стрелом:
import numpy as np
np_func = np.vectorize(my_func) # Векторизация ускоряет обработку
df['new_col'] = np_func(df['col1'], df['col2'])
Для поэлементного умножения можно воспользоваться функцией multiply
из numpy:
df['new_col'] = np.multiply(df['col1'], df['col2']) # Быстрое умножение
Работа с функциями, возвращающими несколько значений
В случае, когда функция возвращает несколько значений, можно получить их одновременно:
df['new_col1'], df['new_col2'] = zip(*df.apply(lambda x: my_multi_value_func(x['col1'], x['col2']), axis=1))
Применение функций по строкам с использованием apply
Не забывайте, что для применения функций по строкам следует установить параметр axis=1
:
df['new_col'] = df.apply(lambda x: my_func(x["col1"], x["col2"]), axis=1)
Визуализация
Представим, что вы – повар, собирающийся приготовить изысканное блюдо из выбранных ингредиентов:
(🥕🧅🧄): [Морковь, Лук, Чеснок]
Ваша задача заключается в приготовлении необыкновенного соуса, комбинируя эти ингредиенты:
def make_special_sauce(ingredient1, ingredient2, ingredient3):
# Здесь зарождается ваше кулинарное искусство
Аналогично, в pandas вы можете создать новый столбец, используя функцию, которая работает с несколькими значениями:
🥘 DataFrame (до):
| Морковь | Лук | Чеснок |
👩🍳 Применение make_special_sauce:
🥘 DataFrame (после):
| Морковь | Лук | Чеснок | Особый соус |_| # Блюдо готово
Столбец 'Особый соус' создан на основе уникальных ингредиентов каждой строки.
Пользовательские функции для сложной логики
Для реализации сложной логики стоит использовать пользовательские функции в сочетании с apply:
def custom_logic(row):
# Развертывание сложной логики
return result
df['new_col'] = df.apply(lambda x: custom_logic(x), axis=1)
Создание нескольких новых столбцов за одну итерацию
Если функция возвращает несколько значений и вы хотите сохранить их в отдельных столбцах:
def get_multiple_metrics(row):
# Функция возвращает кортеж значений
return metric1, metric2
df[['metric1', 'metric2']] = df.apply(lambda x: get_multiple_metrics(x), axis=1, result_type='expand') # Мультизадачность в действии!
Учет разнообразия данных при применении функций
Убедитесь, что функция, которую вы применяете, корректно обрабатывает данные различного типа и учитывает пропущенные значения, чтобы избежать непредсказуемых результатов.
Полезные материалы
- pandas.DataFrame.apply — документация pandas 2.2.0: основной источник информации по
apply()
. - python – Pandas: создание двух новых столбцов в dataframe с значениями, вычисленными из существующего столбца – Stack Overflow: обсуждение практического применения
apply
. - pandas.DataFrame.iterrows — документация pandas 2.2.0: для тех, кто ищет способ обхода строк.
- Работа с текстовыми данными — документация pandas 2.2.0: справочник по работе с текстовыми данными в pandas.
- Основные функции, которые стоит знать — документация pandas 2.2.0: досье по основным функциям.
- numpy.vectorize — Руководство NumPy v1.26: для тех, кто готов перейти на новый уровень с векторизацией.
- Использование pandas и Python для анализа вашего набора данных – Real Python: руководство с примерами использования apply и lambda.