Как стать автором
Обновить

Комментарии 14

Первый пример я бы делал иначе:


sales['MoreThan500'] = False
sales.loc[sales["Sales"] > 500, "MoreThan500"] = True

Причем, можно без первой строки, тогда в ячейках c sales["Sales"] < 500 будет NaN

sales[“MoreThan500”] = sales[“Sales”] > 500
Аналогичный результат, но без нанов

Так красивее всего, да. И намного быстрее всех остальных.

Через np.where кажется выглядит более дружелюбно
sales['MoreThan500'] = np.where(sales['Sales'] > 500, True, False)
numpy поддерживает синтаксис, схожий с Excel IF. Просто он называется where. (Не путать с pandas where)
from numpy import where
sales['MoreThan500'] = where(sales['Sales'] > 500, 'Yes', 'No')

Сравнение скорости выполнения в Jupyter:
Создаем копии датафрейма следующего вида:


df1 = pd.DataFrame(np.random.randint(0,1000,size=(1000000, 4)), columns=list('ABCD'))

Предложенный в статье набор данных слишком мал, чтобы увидеть хоть какую-то разницу.


%%time
df1["MoreThan500"] = "No"
df1.loc[df1["A"] > 500, "MoreThan500"] = "Yes"

CPU times: user 38.8 ms, sys: 4.16 ms, total: 42.9 ms
Wall time: 40.9 ms


%%time
df2["MoreThan500"] = ["Yes" if x > 500 else "No" for x in df2["A"]]

CPU times: user 195 ms, sys: 8.49 ms, total: 203 ms
Wall time: 202 ms


%%time
df3["MoreThan500"] = "No"
df3["MoreThan500"].mask(df3["A"] > 500, "Yes", inplace=True)

CPU times: user 31.6 ms, sys: 5.46 ms, total: 37 ms
Wall time: 35.2 ms


%%time
df4["MoreThan500"] = "Yes"
df4["MoreThan500"].where(df3["A"] > 500, "No", inplace=True)

CPU times: user 30.9 ms, sys: 2.01 ms, total: 33 ms
Wall time: 31.5 ms


Вариант предложенный YuriM1983:


%%time
df5["MoreThan500"] = np.where(df5["A"] > 500, "Yes", "No") 

CPU times: user 80.1 ms, sys: 3.62 ms, total: 83.7 ms
Wall time: 81.8 ms


Абсолютная величина времени отличается от запуска к запуску, но относительная скорость не отличается. Решения pd.where() и pd.mask() быстрее.
Использование булевых True и False будет тоже заметно быстрее, чем "Yes" и "No"


%%time
df6["MoreThan500"] = False
df6["MoreThan500"].mask(df3["A"] > 500, True, inplace=True)

CPU times: user 8.23 ms, sys: 1.58 ms, total: 9.81 ms
Wall time: 7.87 ms

Всё-таки ответ на вопрос «зачем?» не получен :(

Работаю в финансах. Все полезные кейсы python/pandas сводятся к двум: автоматизации рутины и outer join анализу.


Кейс1. Каждый месяц во время и после закрытия периода весь отдел генерирует вручную сотни excel файлов, повторяющих структуру из прошлого периода на новых данных. Большинство из них сводится к повторяющимся действиям типа скопировать из одного файла в другой, убрать ненужные колонки, отфильтровать/удалить ненужное, перетянуть формулы из шаблона, обновить область действия сводной таблицы, обновить саму сводную таблицу и посмотреть/отправить дальше результат.


Как по мне, так python в этом вопросе отлично автоматизирует все эти однотипные перетягивания формул и обновления сводных таблиц. Нажал кнопку, все само перетянулось. Каждый месяц.


Кейс2. Расходятся два источника данных. Есть два массива, которые нужно сравнить. В excel это делается взаимными VLOOKUP-ами на каждом из массивов и последующим анализом в уме двух пересечений или формированием на отдельном листе полного списка ключей и vlookup к ним из обоих массивов. Действие, так скажем, неприятное. Особенно, если сравнивать надо итеративно несколько раз.


В pandas эта операция занимает четыре строчки кода, из которых 3 — это чтение/запись, а одна pd.merge(…, how="outer")

Кейс 1. Всё то же самое есть в VBA.
Кейс 2. Можно реализовать на VBA, в том числе общую процедуру, где будут задаваться нужные параметры. Еще помогает комбинация Excel + Access, где в последнем реализуются функции, характерные для базы данных (все виды joinов и т.п.). Электронные таблицы для обработки баз данных в любом случае не очень подходят, независимо от языка (VBA или Python).

Хотелось бы примеров, которые не сводились бы банально к тому, что одни и те же операторы просто называются по-разному.

В обоих случаях это вопрос удобства и скорости разработки. Ведь то же самое, можно, например, и под c++ написать.


Я же скорее отвечал на вопрос "зачем использовать pandas вместо excel", а не "почему именно pandas, а не другие подобные средства".


Боюсь, что принципиально невозможно придумать кейс, который нельзя было бы реализовать на VBA.


Что касается именования операторов, то в pandas они имеют принципиальное отличие от excel и некоторых других языков /библиотек — они заточены работать сразу со всей таблицей/подтаблицей, а не на построчную обработку.
В итоге вместо цикла, утверждение сводится к оператору присвоения


Pandas это именно что библиотека для обработки электронных таблиц в стиле баз данных.

[offtop]
Зачем вы в своих публикациях внедряете голубые заголоки? Я понимаю что это цвета вашего бренда, но они не сочетаются с цветой схемой этого сайта. К тому же их трудно читать из-за плохой контрастности.
webaim.org/resources/contrastchecker/?fcolor=3AC1EF&bcolor=FFFFFF
[/offtop]
Спасибо за перевод.

Вы извините, но в Экселе это банально делать удобнее, особенно сводные таблицы. Не нужно везде пихать Python, где не лень. Понятно что на питоне можно сделать многое, но должен быть и здравый смысл

Спасибо за статью. Хотелось бы больше подобных статей на тему использования Python для Excel юзеров. Особенно интересно в той части где простые формулы Excel перестают работать: итеративные проверки с перезаписью данных, поиск и выборка приблизительных значений, и т.п.
А при чем здесь «Разработка веб-сайтов»? Ну и про первый пример, все же в пандас лучше обходиться без циклов.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий