Оптимизация расчёта колонок KB, MB, GB в pandas DataFrame
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Если вам требуется извлечь несколько столбцов с использованием метода apply()
в Pandas, просто определите функцию, которая возвращает объект pd.Series
. Индексы данного объекта должны соответствовать названиям новых столбцов:
import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
result = df.apply(lambda x: pd.Series({'Сумма': x['A'] + x['B'], 'Произведение': x['A'] * x['B']}), axis=1)
print(result)
Вывод:
Сумма Произведение
0 4 3
1 6 8
Таким образом, с лёгкостью добавляются новые столбцы Сумма
и Произведение
в ваш DataFrame df
.
Увеличиваем скорость работы с помощью кортежей
Вы можете ускорить выполнение кода в три раза, используя кортеж вместо объекта Series
. Эта оптимизация позволяет обрабатывать данные сразу, что значительно увеличивает производительность.
def compute_metrics(row):
return (row['A'] + row['B'], row['A'] * row['B'])
result = df.apply(lambda x: compute_metrics(x), axis=1, result_type='expand')
df[['Сумма', 'Произведение']] = result
print(df)
Вывод:
A B Сумма Произведение
0 1 3 4 3
1 2 4 6 8
Рассмотрим подробнее параметр result_type='expand'
Параметр result_type='expand'
применяется для разбиения списка значений, возвращаемых функцией apply()
, на отдельные столбцы DataFrame:
result = df.apply(lambda x: [x['A'] + x['B'], x['A'] * x['B']], axis=1, result_type='expand')
df[['Сумма', 'Произведение']] = result
Золотая комбинация: zip() и apply()
Оптимизация вашего кода может быть достигнута применением функции zip()
в паре с apply()
. Это позволяет обойти необходимость использования инструкции result_type='expand'
:
df['Сумма'], df['Произведение'] = zip(*df.apply(lambda x: (x['A'] + x['B'], x['A'] * x['B']), axis=1))
Облагораживаем числа с помощью locale.format()
Числа можно преобразовать в читабельный формат с помощью функции locale.format()
. Понятность данных важна наравне с читаемостью кода:
import locale
locale.setlocale(locale.LC_ALL, '')
df['ФорматСуммы'], df['ФорматПроизведения'] = zip(*df.apply(
lambda x: (
locale.format_string('%f', x['Сумма']),
locale.format_string('%f', x['Произведение'])
),
axis=1
))
Оптимизируем время: множественные расчёты за один проход
Конфигурируйте apply()
, чтобы выполнять несколько вычислений за одну итерацию, это позволит сэкономить время.
Визуализация
Представьте DataFrame как столовую (🍽️), где каждый заказ – это строка, включающая несколько блюд.
Столовая DataFrame (🍽️)
| Клиент | Заказ (apply) 👨🍳 |
| ------ | ------------------- |
| Алиса | 🥗 + 🍲 |
| Боб | 🍔 + 🍟 |
| Кэрол | 🌮 + 🍹 |
# Секретный рецепт двухблюдного обеда
def prepare_meals(row):
return pd.Series([row['Салат'], row['ОсновноеБлюдо']])
Таким образом, каждая строка DataFrame представляет собой два блюда одновременно:
| 🥗 Салат | 🍲 ОсновноеБлюдо |
| ---------- | ---------------- |
| Цезарь | Лазанья |
| Садовый | Чизбургер |
| Тако | Буррито |
Непосредственное направление результатов в новые столбцы DataFrame
Направляйте результаты, полученные с помощью apply()
, непосредственно в новые столбцы DataFrame для более эффективной обработки данных:
df['A_в_квадрате'], df['B_в_квадрате'] = zip(*df.apply(lambda x: (x['A']**2, x['B']**2), axis=1))
Учитываем контекст (или версию)
Производительность может зависеть от версий Pandas. Чтобы достигнуть максимальных результатов, убедитесь, что код оптимизирован для вашей версии Pandas, начиная с 0.23 и выше.
Делаем это по-своему в стиле GroupBy
Для улучшения читаемости можно группировать схожие операции внутри функции apply()
, чтобы облегчить обработку данных.
Полезные материалы
- pandas.DataFrame.apply — документация pandas 2.2.0 — официальная документация Pandas по методу
apply()
. - Возвращение нескольких значений из pandas apply на DataFrame – Stack Overflow — полезные ответы на вопросы по теме возвращения множественных значений на Stack Overflow.
- Возвращение нескольких столбцов из pandas apply() – Stack Overflow — другое ценное обсуждение на Stack Overflow о работе с множеством столбцов.
- Применение лямбда-функций в pandas — статья о применении лямбда-функций с методом apply в Pandas.
- Когда стоит (и не стоит) использовать метод apply() в коде? – Stack Overflow — рекомендации по использованию метода
apply()
для эффективной работы с данными.