TGViewer
OnlyAnalyst by Алексей Гаврилов OnlyAnalyst by Алексей Гаврилов @onlyanalystgroup · 2.45K subscribers
Post #60 784
🚀 Всем привет!

🐼 При работе с данными, используя библиотеку 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
  • 👍 8
  • ❤ 5
More from @onlyanalystgroup
  1. Oct 1, 2026Что, если заменить аналитиков нейросетью? Да ничего хорошего: результаты анализа получаютс…
  2. Sep 24, 2026Post #492
  3. Aug 31, 2026Хорошие новости: все ребята с прошлого потока нашли работу. А значит, можно открывать осен…
  4. Aug 31, 2026OnlyAnalyst by Алексей Гаврилов pinned a photo
  5. Aug 19, 2026Бесплатный ии-агент, который мы заслужили Конечно же тут работает правило, что если что-то…
  6. Aug 10, 2026Новые времена требуют новых решений! Я поддался хайпу и полностью отказался от джунов и да…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →