Оптимизация расчёта колонок KB, MB, GB в pandas DataFrame

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам требуется извлечь несколько столбцов с использованием метода apply() в Pandas, просто определите функцию, которая возвращает объект pd.Series. Индексы данного объекта должны соответствовать названиям новых столбцов:

Python
Скопировать код
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.

Кинга Идем в IT: пошаговый план для смены профессии

Увеличиваем скорость работы с помощью кортежей

Вы можете ускорить выполнение кода в три раза, используя кортеж вместо объекта Series. Эта оптимизация позволяет обрабатывать данные сразу, что значительно увеличивает производительность.

Python
Скопировать код
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:

Python
Скопировать код
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':

Python
Скопировать код
df['Сумма'], df['Произведение'] = zip(*df.apply(lambda x: (x['A'] + x['B'], x['A'] * x['B']), axis=1))

Облагораживаем числа с помощью locale.format()

Числа можно преобразовать в читабельный формат с помощью функции locale.format(). Понятность данных важна наравне с читаемостью кода:

Python
Скопировать код
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 как столовую (🍽️), где каждый заказ – это строка, включающая несколько блюд.

Markdown
Скопировать код
Столовая DataFrame (🍽️)
| Клиент | Заказ (apply) 👨‍🍳 |
| ------ | ------------------- |
| Алиса  | 🥗 + 🍲             |
| Боб    | 🍔 + 🍟             |
| Кэрол  | 🌮 + 🍹             |
`
Python
Скопировать код
# Секретный рецепт двухблюдного обеда
def prepare_meals(row):
    return pd.Series([row['Салат'], row['ОсновноеБлюдо']])

Таким образом, каждая строка DataFrame представляет собой два блюда одновременно:

Markdown
Скопировать код
| 🥗 Салат   | 🍲 ОсновноеБлюдо |
| ---------- | ---------------- |
| Цезарь     | Лазанья          |
| Садовый    | Чизбургер        |
| Тако       | Буррито          |
`

Непосредственное направление результатов в новые столбцы DataFrame

Направляйте результаты, полученные с помощью apply(), непосредственно в новые столбцы DataFrame для более эффективной обработки данных:

Python
Скопировать код
df['A_в_квадрате'], df['B_в_квадрате'] = zip(*df.apply(lambda x: (x['A']**2, x['B']**2), axis=1))

Учитываем контекст (или версию)

Производительность может зависеть от версий Pandas. Чтобы достигнуть максимальных результатов, убедитесь, что код оптимизирован для вашей версии Pandas, начиная с 0.23 и выше.

Делаем это по-своему в стиле GroupBy

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

Полезные материалы

  1. pandas.DataFrame.apply — документация pandas 2.2.0 — официальная документация Pandas по методу apply().
  2. Возвращение нескольких значений из pandas apply на DataFrame – Stack Overflow — полезные ответы на вопросы по теме возвращения множественных значений на Stack Overflow.
  3. Возвращение нескольких столбцов из pandas apply() – Stack Overflow — другое ценное обсуждение на Stack Overflow о работе с множеством столбцов.
  4. Применение лямбда-функций в pandas — статья о применении лямбда-функций с методом apply в Pandas.
  5. Когда стоит (и не стоит) использовать метод apply() в коде? – Stack Overflow — рекомендации по использованию метода apply() для эффективной работы с данными.