🐼 При работе с данными, используя библиотеку pandas в Python, обычно возникает необходимость применить операцию к каждой строке DataFrame. Один из способов сделать это - использовать итерацию строк. Однако этот подход может быть медленным и неэффективным, особенно для больших наборов данных.
🧭 В этом посте мы рассмотрим, как использовать метод .apply() и векторизацию, которые могут значительно повысить производительность.
👉 Предположим, у нас есть DataFrane с двумя столбцами "x" и "y", и мы хотим создать новый столбец "z", который является суммой "x" и "y" для каждой строки.
import pandas as pd
df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})
for index, row in df.iterrows():
df.loc[index, 'z'] = row['x'] + row['y']👷♀️ Метод
.iterrows() перебирает каждую строку DataFrame, а затем вычисляет сумму "x" и "y" для каждой строки. Метод .loc используется для установки значения нового столбца "z" для каждой строки.♾️ Теперь давайте посмотрим, как мы можем использоваь векторизацию. Pandas предоставляет множество векторизованных операций, которые могут быть применены сразу ко всему столбцу или DataFrame, что может быть намного быстрее, чем итерация строк.
df['z'] = df['x'] + df['y']➕ Создаем новый столбец "z", просто складывая столбцы "x" и "y" вместе с помощью оператора "+". Эта операция применяется сразу ко всему DataFrame, что намного быстрее, чем циклическое прохождение по каждой строке.
🍏 Наконец, давайте используем метод
.apply() с лямбда-функцией для достижения того же результата.df['z'] = df.apply(lambda row: row['x'] + row['y'], axis=1)🐸 Этот код применяет лямбда-функцию к каждой строке DataFrame, чтобы вычислить сумму "x" и "y" и создать новый столбец "z" для сохранения результата.
⚖️ Чтобы сравнить производительность этих трех методов, давайте создадим больший DataFrane со 100 000 строками.
import numpy as np
df = pd.DataFrame({'x': np.random.randint(0, 10, size=100000), 'y': np.random.randint(0, 10, size=100000)})🧮 Теперь давайте подсчитаем, сколько времени потребуется, чтобы создать новый столбец "z", используя итерацию строк, векторизацию и
.apply()# Итерация строк
start_time = time.time()
for index, row in df.iterrows():
df.loc[index, 'z'] = row['x'] + row['y']
end_time = time.time()
print(f"Time using row iteration: {end_time - start_time:.4f}s")
# Векторизация
start_time = time.time()
df['z'] = df['x'] + df['y']
end_time = time.time()
print(f"Time using vectorisation: {end_time - start_time:.4f}s")
# Apply
start_time = time.time()
df['z'] = df.apply(lambda row: row['x'] + row['y'], axis=1)
end_time = time.time()
print(f"Time using apply with lambda: {end_time - start_time:.4f}s")Time using row iteration: 5.4305s
Time using vectorisation: 0.0021s
Time using apply with lambda: 0.7210s🛬 На моем компьютере запуск этого кода занимает около 5 секунд при использовании итерации строк, метод
.apply() выполняется почти секунду, а векториазция заняла всего 2 тысячных секунды. 🙇 Как вы думаете, когда использование итерации или метод .apply() оправдано? Какие результаты будут с 1 000 000 строк? Жду Ваших ответов в комментариях!
#pandas