Как сделать частоты относительными в pandas
Pandas - это широко используемый пакет Python для структурированных данных. Существует много хороших учебных пособий на данную тематику, но здесь мы бы хотели раскрыть несколько интересных приемов, которые, вероятно, еще пока неизвестны читателю, но могут оказаться крайне полезными.
read_csv
Все знают эту команду. Но если данные, которые вы пытаетесь прочитать, слишком большие, попробуйте добавить команду nrows = 5 , чтобы прочитать сначала небольшую часть данных перед загрузкой всей таблицы. В этом случае вам удастся избежать ситуации выбора неверного разделителя (не всегда в данных есть разделение в виде запятой).
(Или вы можете использовать команду ‘head’ в linux для проверки первых 5 строк в любом текстовом файле: head -c 5 data.txt )
Затем вы можете извлечь список столбцов, используя df.columns.tolist() , а затем добавить команду usecols = ['c1', 'c2',…], чтобы извлечь только нужные вам столбцы. Кроме того, если вы знаете типы данных определенных столбцов, вы можете добавить dtype = для более быстрой загрузки. Еще одно преимущество этой команды в том, что если у вас есть столбец, который содержит как строки, так и числа, рекомендуется объявить его тип строковым, чтобы не возникало ошибок при попытке объединить таблицы, используя этот столбец в качестве ключа.
select_dtypes
Если предварительная обработка данных должна выполняться в Python, то эта команда сэкономит ваше время. После чтения из таблицы типами данных по умолчанию для каждого столбца могут быть bool, int64, float64, object, category, timedelta64 или datetime64. Вы можете сначала проверить распределение с помощью
Например: True, False до 1, 0 (для моделирования); определение уровней; определяемые пользователем лексические кодировки.
apply or not apply?
Если нужно создать новый столбец с несколькими другими столбцами в качестве входных данных, функция apply была бы весьма полезна.
В приведенных выше кодах мы определяем функцию с двумя входными переменными и используем функцию apply, чтобы применить ее к столбцам 'c1' и 'c2'.
Вывод: не используйте команду apply, если вы можете выполнить ту же работу используя другие функции (они часто быстрее). Например, если вы хотите округлить столбец 'c' до целых чисел, выполните округление (df ['c'], 0) вместо использования функции apply.
value counts
D. df[‘c].value_counts().reset_index().: если вы хотите преобразовать таблицу статистики в датафрейм Pandas и управлять ими.
количество пропущенных значений
При построении моделей может потребоваться исключить строку со слишком большим количеством пропущенных значений / строки со всеми пропущенными значениями. Вы можете использовать .isnull () и .sum () для подсчета количества пропущенных значений в указанных столбцах.
выбрать строки с конкретными идентификаторами
Percentile groups
Допустим, у вас есть столбец с числовыми значениями, и вы хотите классифицировать значения в этом столбце по группам, скажем, топ 5% в группу 1, 5–20% в группу 2, 20–50% в группу 3, нижние 50% в группу 4. Конечно, вы можете сделать это с помощью pandas.cut, но мы бы хотели представить другую функцию:
to_csv
Вы можете использовать эту команду, чтобы напечатать первые пять строк того, что будет записано непосредственно в файл.
Еще один прием касается смешанных вместе целых чисел и пропущенных значений. Если столбец содержит как пропущенные значения, так и целые числа, тип данных по-прежнему будет float, а не int. Когда вы экспортируете таблицу, вы можете добавить float_format = '%. 0f', чтобы округлить все числа типа float до целых чисел. Используйте этот прием, если вам нужны только целочисленные выходные данные для всех столбцов – так вы избавитесь от всех назойливых нулей ‘.0’ .
Одна из базовых функций анализа данных - группировка и агрегирование. В некоторых случаях этого уровня анализа может быть достаточно, чтобы ответить на вопросы бизнеса. В других случаях - это может стать первым шагом в более сложном анализе.
В pandas функцию groupby можно комбинировать с одной или несколькими функциями агрегирования, чтобы быстро и легко обобщать данные. Эта концепция обманчиво проста и большинство новых пользователей pandas поймут ее. Однако они удивятся тому, насколько полезными могут стать функции агрегирования для проведения сложного анализа данных.
В этом Блокноте кратко изложены основные функции агрегирования pandas и показаны примеры более сложных настраиваемых агрегаций. Независимо от того, являетесь ли вы начинающим или опытным пользователем pandas, я думаю, вы узнаете что-то новое для себя.
Оригниал статьи Криса тут.
Агрегирование¶
В контексте даннной статьи функция агрегирования - это функция, которая принимает несколько отдельных значений и возвращает сводные данные. В большинстве случаев возвращаемые данные представляют собой одно значение.
Наиболее распространенные функции агрегирования - это простое среднее (simple average) или суммирование (summation) значений.
Далее представлен пример расчета суммарной и средней стоимости билетов для набора данных "Титаник", загруженного из пакета seaborn.
15 апреля 1912 года самый большой пассажирский лайнер в истории во время своего первого рейса столкнулся с айсбергом. Когда Титаник затонул, погибли 1502 из 2224 пассажиров и членов экипажа. Эта сенсационная трагедия потрясла международное сообщество и привела к улучшению правил безопасности для судов. Одна из причин, по которой кораблекрушение привело к гибели людей, заключалась в том, что не хватало спасательных шлюпок для пассажиров и экипажа. Несмотря на то, что в выживании после затопления была определенная доля удачи, некоторые группы людей имели больше шансов выжить, чем другие.
03.07.2020 | Захаров Георгий, г.Москва | 0
Не будем утруждать себя переходом на сайт и скачиванием документа. Считаем его прямо в коде программы по url:
В представленной выше таблице собраны данные о том, какой размер чаевых оставляют люди в зависимости от дня недели, итогового счёта, пола, времени приёма пищи и, даже, размера одежды и пристрастия к курению. В таблице 6 столбцов и 244 строки. При помощи команды
можно увидеть, какого типа данные собраны в таблице:
А теперь приступим к преобразованиям.
1. MAP
Получим следующий результат (рис 2 ). В первой строке указано время выполнения кода, вычисленное при помощи модуля datetime.
Результат выполнения программы :
Как видно, получилось даже получить небольшой выигрыш в скорости.
2. IDXMIN/IDXMAX + NE
Команда idxmax() возвращает индекс первого вхождения максимального значения в столбце. Команда idxmin(), очевидно, делает то же самое для минимального. Это позволяет быстро найти запись в DataFrame, которая соответствовала бы максимальному или минимальному значению.
Например, команда dataframe[‘total_bill’].idxmax() вернёт результат 170. Это значит, что запись с максимальным итоговым счётом находится на 170-ой строке нашей таблицы. Получить её можно с помощью команды dataframe.loc[dataframe[‘total_bill’].idxmax()]:
Но это не самое интересное применение данных команд, хоть и полезное.
Теперь рассмотрим, как эти две команды работают в связке:
Так можно искать информацию о первом вхождении нового элемента после последовательности повторяющихся. А главное, чуть-чуть подкорректировав команду, мы получим список всех записей, начиная с обнаруженной позиции:
Этот приём может быть особенно полезен для анализа временных рядов с повторяющимися значениями в начале.
3. NSMALLEST/NLARGEST
Для того, чтобы получить топ-5 посетителей с самыми большими оплаченным счетами, обычно применяют два метода: сначала выполняют метод sort_values(), в котором указывают ключ ascending = False, а затем методом head() то есть отсекают необходимое количество записей. Вот как это выглядит в коде:
Применение двух последовательных методов можно заменить одним – методом nlargest(). Данный метод принимает, в качестве аргументов, количество записей, которые мы хотим отобрать и столбец, по которому мы выполняем поиск.
Чтобы получить топ-5 посетителей с наибольшим оплаченным счётом при помощи nlargest(), нужно будет выполнить код:
Здесь видно, что мы немного проигрываем в скорости выполнения, но зато код становится более компактным и интерпретируемым, что тоже немаловажно.
Как несложно догадаться из названия, метод nsmallest() будет делать то же самое, что и nlargest(), но выдавать не топ наибольших, а топ наименьших значений.
4. ISIN ПРОТИВ APPLY
Если есть необходимость применить к одному или нескольким столбцам DataFrame какую-нибудь функцию, то для этого используют метод apply(). Но на больших данных этот метод может работать достаточно долго, поэтому рекомендуется не использовать его там, где функцию можно реализовать без apply().
Таким примером может стать поиск в DataFrame записей, у которых некоторая переменная принимает одно из множества заданных значений. В SQL подобный функционал реализуется запросом типа:
А теперь напишем фильтр, в котором применим метод apply() и lambda-функцию, проверяющую, лежит ли значение в векторе sample:
Теперь заменим применение этих методов на выполнение одного метода – isin():
В результате мы видим, что код не только стал более читаемым и компактным, но ещё мы получили выигрыш в скорости выполнения программы.
5. VALUE_COUNTS И НЕМНОГО ГРАФИКОВ
Часто при работе с данными бывает полезно построить распределение величины.
В нашем случае зададимся простой задачей: построить распределение размера оплаченных чаевых.
Для этого нам понадобится DataFrame из двух столбцов: в первом будет размер чаевых, во втором – количество человек, оставивших эти чаевые.
Подойти к решению этой задачи можно с двух сторон. Первый подход основывается на уже классической связке groupby-aggregate. Мы группируем данные в DataFrame по размеру чаевых и считаем количество счетов, в которых эти чаевые были оставлены. В коде это реализуется следующим образом:
Посмотрим на первые 5 позиций, которые нам выдаст такой код:
При помощи метода values_count() и метода reset_index() выполним эту же операцию без группировки.
reset_index() нужен для сохранения результатов работы первого метода в формате DataFrame.
Посмотрим на результат работы этого кода. Возьмём для наглядности также первые 5 позиций.
Наглядно видно, что в этом случае мы не только сделали код более компактным, но и получили выигрыш в скорости работы.
Теперь полученный DataFrame subdf можно использовать по его прямому назначению – построить график. Сделаем это по десяти значениям с наибольшей частотой:
Кстати, использованная в примере библиотека plotly, позволяет строить в Jupiter Notebook интерактивные графики с широкими возможностями для настройки и детализации.
Почитать о её возможностях можно здесь.
Эти небольшие лайфхаки позволят сделать ваш код более красивым и быстрым. Естественно, этими приёмам не ограничивается весь набор интересных возможностей при работе с DataFrame в pandas. Чтобы научиться большему и начать писать лучше, необходимо читать документацию, тематические форумы, а главное – практиковаться.
Перед изучением убедитесь, что вы достаточно хорошо ознакомились с первой частью нашего материала про pandas.
Операции в pandas¶
1. Простые операции¶
Сгенерируем случайные числа и представим их в виде DataFrame .
A | B | C | D | |
---|---|---|---|---|
0 | -1.345702 | 1.583271 | 0.480914 | -0.053891 |
1 | -1.513222 | 0.389656 | 0.448918 | -0.265700 |
2 | 0.817235 | -1.573969 | -0.080860 | 2.160590 |
3 | -0.773110 | 0.569715 | 0.078057 | -0.215249 |
4 | -0.178111 | 0.286518 | 0.035825 | 0.805861 |
5 | 0.849732 | -0.182298 | -0.224015 | 0.208410 |
6 | -1.701552 | -0.586663 | -1.313644 | 0.470541 |
7 | -0.373508 | -0.813824 | -0.251265 | -0.834696 |
8 | -0.745802 | -0.160359 | -0.934386 | -0.358681 |
9 | -1.116177 | 0.229204 | -2.352976 | -0.348601 |
Выведем описательные статистики по столбцам — количество значений, среднее, стандартное отклонение (корень из дисперсии), минимум, квантили, максимум.
A | B | C | D | |
---|---|---|---|---|
count | 10.000000 | 10.000000 | 10.000000 | 10.000000 |
mean | -0.608022 | -0.025875 | -0.411343 | 0.156858 |
std | 0.898149 | 0.859838 | 0.882121 | 0.843477 |
min | -1.701552 | -1.573969 | -2.352976 | -0.834696 |
25% | -1.288321 | -0.485572 | -0.763606 | -0.327876 |
50% | -0.759456 | 0.034423 | -0.152438 | -0.134570 |
75% | -0.226960 | 0.363871 | 0.067499 | 0.405008 |
max | 0.849732 | 1.583271 | 0.480914 | 2.160590 |
Среднее по столбцам
Оценка матрицы корреляций значений в столбцах
A | B | C | D | |
---|---|---|---|---|
A | 1.000000 | -0.524331 | 0.210587 | 0.522391 |
B | -0.524331 | 1.000000 | 0.240015 | -0.474598 |
C | 0.210587 | 0.240015 | 1.000000 | 0.154964 |
D | 0.522391 | -0.474598 | 0.154964 | 1.000000 |
Применение функции к данным. Для примера посчитаем разброс значений — разница максимума и минимума.
2. Объединение таблиц¶
2.1 Функция df.append ¶
Добавление строк в виде таблицы other в таблицу df . При наличии у новых строк колонок, которых нет в таблице, они добавляются в таблицу.
df.append(other, ignore_index=False, verify_integrity=False, sort=None)
- df — таблица;
- other — добавляемые строки в виде таблицы;
- ignore_index — сохранить индексы или определить и как $0, . n-1$;
- verify_integrity — если True , то создает исключение в случае повторения индексов;
- sort — сортировать ли колонки, если они (или их порядок) различаются.
Создадим новую таблицу из первых четырех строк таблицы df . В новую таблицу добавим колонку flag , в которую запишем условие, что число в столбце D положительно. Затем добавим строки из новой таблицы к старой. Полученная таблица содержит пропуски, которые отмечены как NaN .
A | B | C | D | flag | |
---|---|---|---|---|---|
0 | -1.345702 | 1.583271 | 0.480914 | -0.053891 | NaN |
1 | -1.513222 | 0.389656 | 0.448918 | -0.265700 | NaN |
2 | 0.817235 | -1.573969 | -0.080860 | 2.160590 | NaN |
3 | -0.773110 | 0.569715 | 0.078057 | -0.215249 | NaN |
4 | -0.178111 | 0.286518 | 0.035825 | 0.805861 | NaN |
5 | 0.849732 | -0.182298 | -0.224015 | 0.208410 | NaN |
6 | -1.701552 | -0.586663 | -1.313644 | 0.470541 | NaN |
7 | -0.373508 | -0.813824 | -0.251265 | -0.834696 | NaN |
8 | -0.745802 | -0.160359 | -0.934386 | -0.358681 | NaN |
9 | -1.116177 | 0.229204 | -2.352976 | -0.348601 | NaN |
10 | -1.345702 | 1.583271 | 0.480914 | 0.002904 | False |
11 | -1.513222 | 0.389656 | 0.448918 | 0.070597 | False |
12 | 0.817235 | -1.573969 | -0.080860 | 4.668147 | True |
13 | -0.773110 | 0.569715 | 0.078057 | 0.046332 | False |
2.2 Функция pd.concat ¶
Соединение таблиц вдоль выбранной оси
pd.concat(objs, axis=0, join='outer', ignore_index=False, copy=True, . )
- objs — объединяемые таблицы;
- axis : < 0 или 'index' , 1 или 'columns' >— ось индексов или ось колонок, иными словами соединение по вертикали или по горизонтали;
- join : < 'inner' , 'outer' >— тип объединения — пересечение или объединение индексов/колонок;
- ignore_index — сохранить индексы или определить и как $0, . n-1$;
- copy — копировать данные или нет.
Простой пример соединения таблиц:
A | B | C | D | |
---|---|---|---|---|
0 | -1.345702 | 1.583271 | 0.480914 | -0.053891 |
1 | -1.513222 | 0.389656 | 0.448918 | -0.265700 |
2 | 0.817235 | -1.573969 | -0.080860 | 2.160590 |
3 | -0.773110 | 0.569715 | 0.078057 | -0.215249 |
4 | -0.178111 | 0.286518 | 0.035825 | 0.805861 |
5 | 0.849732 | -0.182298 | -0.224015 | 0.208410 |
6 | -1.701552 | -0.586663 | -1.313644 | 0.470541 |
7 | -0.373508 | -0.813824 | -0.251265 | -0.834696 |
8 | -0.745802 | -0.160359 | -0.934386 | -0.358681 |
9 | -1.116177 | 0.229204 | -2.352976 | -0.348601 |
2.3 Функции pd.merge и df.join ¶
Слияние таблиц по вертикали путем выполнения операций слияния баз данных в стиле SQL.
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, suffixes=('_x', '_y'), . )
- left и right — объединяемые таблицы.
- how — тип объединения:
- left — только по ключам из левой таблицы == SQL left outer join;
- right — только по ключам из правой таблицы == SQL right outer join;
- outer — по объединению ключей == SQL full outer join;
- inner — по пересечению ключей == SQL inner join.
Пример. Опция how=left, left_on='A', right_on='B' соответствует взятию всех строк из таблицы left , а из таблицы right берутся те строки, в которых значения в колонке A таблицы left совпадает со значением колонки B таблицы right . Если в одной из таблиц таких значений несколько, то строки другой таблицы дублируются. Если в таблице right каких-то значений нет, то в результирующей таблице будут пропуски.
Читайте также: