Рубрики
Без рубрики

Панды: Условная Группировка Значений

В этой статье мы будем условно группировать значения с пандами. Мы уже подробно рассмотрели группу панд Питона. Так что вы можете посмотреть через

Автор оригинала: Pankaj Kumar.

В этой статье мы будем условно группировать значения с пандами. Мы уже подробно рассмотрели группу панд Питона. Таким образом, вы можете просмотреть статью, если вы не уверены в том, как работает эта функция.

Что такое Группировка?

Группировка базы данных/фрейма данных является обычной практикой в повседневном анализе и очистке данных. Группировка означает объединение идентичных данных (или данных, имеющих одинаковые свойства) в разные группы.

Например : Представьте себе школьную базу данных, в которой есть ученики всех классов. Теперь, если директор хочет сравнить результаты/посещаемость между классами, ему нужно сравнить средние данные по каждому классу. Но как он может это сделать? Он группирует данные учащихся в зависимости от того, к какому классу они принадлежат (учащиеся одного класса входят в одну группу), а затем усредняет данные по каждому учащемуся в группе.

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

Существует также очень простая проблема, которую мы проигнорировали в нашем примере: все данные в базе данных не нужно усреднять. Например, если нам нужно сравнить только среднюю посещаемость и процент каждого класса, мы можем игнорировать другие значения, такие как номер мобильного телефона или номер рулона, среднее значение которых действительно не имеет смысла. В этой статье мы узнаем, как создавать такие сложные команды группировки в панд.

Группировка в панд с помощью df.groupby()

Pandas d f.groupby() предоставляет функцию для разделения фрейма данных, применения такой функции, как mean() и sum() для формирования сгруппированного набора данных. Это кажется страшной операцией для фрейма данных, поэтому давайте сначала разделим работу на 2 набора: разделение данных и применение и расчесывание данных. Для этого примера мы используем набор данных супермаркета из Kaggle.

Метод группирования панд
# Importing the data
import pandas as pd

# Our dataframe. The csv file can be downloaded fro above hyperlink.
df = pd.read_csv('supermarket_sales - Sheet1.csv')

# We drop some redundant columns
df.drop(['Date', 'Invoice ID', 'Tax 5%'], axis=1, inplace=True)
# Display the dataset
df.head()

Выход:

Головка набора данных 1

Функция df.groupby() будет принимать метки или список меток. Здесь мы хотим сгруппироваться в соответствии с ветвью столбца, поэтому в определении функции мы указываем только “Ветвь”. Нам также нужно указать, по какой оси будет выполняться группировка. представляет “столбцы” и ось=0 указывает “индекс”.

# We split the dataset by column 'Branch'.
# Rows having the same Branch will be in the same group.
groupby = df.groupby('Branch', axis=0)

# We apply the accumulator function that we want. Here we use the mean function here but we can also other functions. 
groupby.mean()

Выход:

Средняя ветвь набора данных

Теперь, когда мы научились создавать сгруппированные фреймы данных, мы рассмотрим применение условий к данным для группировки.

Дискретные и непрерывные данные

Иерархия данных

Общепринятой практикой является использование дискретных(табличных) данных для группировки. Непрерывные данные не подходят для группировки. Но не ограничит ли это наши возможности анализа данных? Да, Очевидно. Поэтому нам нужен обходной путь. Мы выполним бинирование непрерывных данных, чтобы сделать данные табличными.

Например: Процент-это непрерывные данные, для преобразования их в помеченные данные мы берем четыре предопределенные группы – Отличные(75-100), Хорошие(50-75), Плохие(25-50), Очень плохие(0-25). Все данные, какими бы разнообразными они ни были, будут разделены на эти 4 группы.

Непрерывный До Дис 1

Другим способом может быть использование true и false для разных значений.

Например, Менеджер супермаркета хочет узнать, сколько клиентов купили более 3 товаров одновременно . Один из способов сделать это-заменить количество статей на 1/True, если число больше или равно 3 или 0/False.

# Binning of the data based on a condition
df.loc[df.Quantity < 3, 'Quantity'] = 0
df.loc[df.Quantity >= 3, 'Quantity'] = 1

# Grouping and couting
df.groupby('Quantity').count()

Выход:

Среднее количество

Условная группировка значений по другим столбцам

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

  1. Нам нужно отфильтровать интересующие нас столбцы.
  2. Если группировка выполняется по непрерывным данным, нам нужно преобразовать непрерывные данные в табличные данные.
  3. Используйте df.groupby() для разделения данных.
  4. Примените функцию агрегирования.
# Filter out columns of our interest
df_1 = df.loc(:, ["Quantity", "Unit price"])

# We have already binned the quantity data into 0 and 1's for counting.
# So we don't need any pre-processing

# Group the data
groupby = df_1.grouby("Quantity", axis=0)

# Apply the function( here mean)
grouby.mean()
условная группировка значений

Как видно из приведенного выше рисунка, цена единицы изделий, которые были куплены более чем за 3 раза, составляет 55,5846.

Панды облегчают выполнение запросов с помощью встроенных функций, таких как df.filter() и df.query() . Это позволяет пользователю выполнять более сложные и сложные запросы к базе данных. Это абстракции более высокого уровня для df.loc, которые мы видели в предыдущем примере

метод df.filter()

Метод фильтра Pandas позволяет фильтровать метки фрейма данных. Он не влияет на содержимое фрейма данных. Вот пример, чтобы отфильтровать метку города и пола в нашем наборе данных.

df = pd.read_csv('supermarket_sales - Sheet1.csv')

# We need to mention the labels to be filterd in items
df.filter(items=["City","Gender"]).head()
условная группировка значений

Мы также можем использовать регулярное выражение для фильтрации меток. Мы пробуем фильтровать этикетки, начинающиеся с буквы C.

# We can specify the regex literal under regex in the function
df.filter(regex="^C").head()
условная группировка значений

метод df.query()

Метод запроса позволяет запрашивать содержимое столбца фрейма данных произвольной сложности. Вот пример, чтобы выяснить случаи, когда клиенты покупали более 3 статей одновременно.

df.query('Quantity > 3').head()
Скриншот С 2021 03 17 18 03 39

Мы также можем объединить многие условия вместе, используя ” & “и”|”. Например, мы хотим выяснить случаи, когда клиенты покупали более 3 предметов сразу и оплачивали их наличными.

df.query('Quantity > 3 & Payment=="Cash"').head()
условная группировка значений

Объединение df.query() и df.filter() и df.groupby()

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

Мы действуем в этих трех шагах:

  1. Используйте df.query() для фильтрации данных, содержащих более 3 статей.
  2. Используйте df.filter () , чтобы сохранить только интересующие метки( здесь Город и цена за единицу)
  3. Используйте df.groupby() для группировки данных
# Query the database for Quantity greater than 3
df_g = df.query('Quantity > 3')

# Filter out labels of interest
df_g = df_g.filter(['City', 'Unit price'])

# Group the value according to a condition
df_g.groupby('City').mean()
Скриншот С 2021 Года 03 17 18 23 57

Рекомендации