Як згрупувати однакові значення і порахувати їх частоту в Python?


10

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

У мене є набір даних про транзакції для торгової точки. Змінні разом із поясненням:

  • розділ: секція магазину, вул;
  • prod_name: назва продукту, str;
  • квитанція: номер рахунку-фактури, int;
  • касир, номер касира, int;
  • вартість: вартість предмета, поплавок;
  • дата, у форматі MM / DD / YY, str;
  • час, у форматі HH: MM: SS, str;

Квитанція має однакове значення для всіх товарів, придбаних за одну транзакцію, таким чином, її можна використовувати для визначення середньої кількості покупок, здійснених за одну транзакцію.

Який найкращий шлях для цього? Я по суті хочу використовувати 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

Відповіді:


15

З цього набору зразків я б очікував гістограми отримання, яка показує два випадки отримання 102857 (оскільки ця особа купила два предмети однією транзакцією) та одну зустріч відповідно отримання 102856 та квитанції 102858.

Тоді ви хочете:

df.groupby ("квитанція"). accept.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

Я збираю декілька навчальних посібників навколо спірних даних. Можливо, мій зошит з юпітером на 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 найбільш повторюваних) Змініть номер у головній функції, щоб отримати більше чи менше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.