Как сгруппировать одинаковые значения и посчитать их частоту в Python?

10

Новичок в аналитике с Python, поэтому, пожалуйста, будьте осторожны :-) Я не смог найти ответ на этот вопрос - извинения, если на него уже ответили в другом формате в другом формате.

У меня есть набор данных транзакций для торговой точки. Переменные вместе с объяснением:

  • раздел: раздел магазина, ул;
  • prod_name: название продукта, ул;
  • квитанция: номер счета, int;
  • кассир, номер кассира, int;
  • стоимость: стоимость предмета, поплавок;
  • дата, в формате ММ / ДД / ГГ, ул;
  • время, в формате ЧЧ: ММ: СС, ул;

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

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

Работа с данными в панде DataFrame.

РЕДАКТИРОВАТЬ:

Вот некоторые примеры данных с заголовком (prod_name на самом деле является шестнадцатеричным числом):

 section,prod_name,receipt,cashier,cost,date,time 
 electronics,b46f23e7,102856,5,70.50,05/20/15,9:08:20 
 womenswear,74558d0d,102857,8,20.00,05/20/15,9:12:46 
 womenswear,031f36b7,102857,8,30.00,05/20/15,9:12:47 
 menswear,1d52cd9d,102858,3,65.00,05/20/15,9:08:20 

Из этого набора образцов я бы ожидал гистограмму получения, которая показывает два случая получения 102857 (так как этот человек купил две позиции в одной транзакции) и одно вхождение соответственно получения 102856 и получения 102858. Примечание: мой набор данных невелик, примерно 1 миллион строк

new_analyst
источник
Готово, добавлен пример данных.
new_analyst

Ответы:

15

Из этого набора образцов я бы ожидал гистограмму получения, которая показывает два случая получения 102857 (так как этот человек купил две позиции в одной транзакции) и одно вхождение соответственно получения 102856 и получения 102858.

Тогда вы хотите:

df.groupby ( 'получение'). receipt.count ()

receipt
102856    1
102857    2
102858    1
Name: receipt, dtype: int64
Эмре
источник
так как результат больше не является фреймом данных, как мы можем отфильтровать это, чтобы показывать только те значения, которые имеют число больше 1?
Nikhil VJ
1
Вы все еще можете делать такие вещи, как s[s>1], гдеs=df.groupby('receipt').receipt.count()
Эмре
2

Я собираю несколько уроков по обработке данных. Может быть, моя тетрадь Jupyter на GitHub поможет. Я думаю, что именно ключ модифицирует строку:

df.groupby('male')['age'].mean()

быть:

df.groupby('reciept')['prod_name'].count()

Для группировки по нескольким переменным это должно работать:

df.groupby(['reciept','date'])['reciept'].count()
Райан
источник
Спасибо за это. Однако иногда квитанция повторяется (когда дата также отличается). Поэтому мы агрегируем все разные случаи поступления даже в разные даты, когда мы действительно хотим узнать номер поступления по транзакции, однако уникальной переменной идентификатора транзакции не существует. Я не думаю, что квитанция повторяется в тот же день - можем ли мы использовать дату как способ группировки? df.groupby('reciept')['date'].count()дает тот же результат, что иdf.groupby('reciept')['prod_name'].count()
new_analyst
Добавьте дату в качестве параметра внутри группового вызова. Отредактировал мой ответ выше для группировки по нескольким переменным.
Райан
0

Из того, что я могу понять, вам нужна гистограмма вашей квитанции. Вы можете попробовать что-то вроде этого

import pandas as pd data = np.read_csv("your_file_path.csv") data.groupby(["receipt"])receipt.count().sort_values(ascending=False).head(20).plot.bar()

Это даст вам гистограмму наиболее повторяющихся номеров счетов (20 наиболее повторяющихся). Измените число в функции заголовка, чтобы получить больше или меньше.

Бхарат К.Н.
источник