Комментарии 14
Первый пример я бы делал иначе:
sales['MoreThan500'] = False
sales.loc[sales["Sales"] > 500, "MoreThan500"] = True
Причем, можно без первой строки, тогда в ячейках c sales["Sales"] < 500
будет NaN
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")
Кейс 2. Можно реализовать на VBA, в том числе общую процедуру, где будут задаваться нужные параметры. Еще помогает комбинация Excel + Access, где в последнем реализуются функции, характерные для базы данных (все виды joinов и т.п.). Электронные таблицы для обработки баз данных в любом случае не очень подходят, независимо от языка (VBA или Python).
Хотелось бы примеров, которые не сводились бы банально к тому, что одни и те же операторы просто называются по-разному.
В обоих случаях это вопрос удобства и скорости разработки. Ведь то же самое, можно, например, и под c++ написать.
Я же скорее отвечал на вопрос "зачем использовать pandas вместо excel", а не "почему именно pandas, а не другие подобные средства".
Боюсь, что принципиально невозможно придумать кейс, который нельзя было бы реализовать на VBA.
Что касается именования операторов, то в pandas они имеют принципиальное отличие от excel и некоторых других языков /библиотек — они заточены работать сразу со всей таблицей/подтаблицей, а не на построчную обработку.
В итоге вместо цикла, утверждение сводится к оператору присвоения
Pandas это именно что библиотека для обработки электронных таблиц в стиле баз данных.
Зачем вы в своих публикациях внедряете голубые заголоки? Я понимаю что это цвета вашего бренда, но они не сочетаются с цветой схемой этого сайта. К тому же их трудно читать из-за плохой контрастности.
webaim.org/resources/contrastchecker/?fcolor=3AC1EF&bcolor=FFFFFF
[/offtop]
Спасибо за перевод.
Вы извините, но в Экселе это банально делать удобнее, особенно сводные таблицы. Не нужно везде пихать Python, где не лень. Понятно что на питоне можно сделать многое, но должен быть и здравый смысл
Python, pandas и решение трёх задач из мира Excel