Jak grupować identyczne wartości i liczyć ich częstotliwość w Pythonie?

10

Początkujący w analityce za pomocą Pythona, więc proszę, bądź łagodny :-) Nie mogłem znaleźć odpowiedzi na to pytanie - przepraszam, jeśli jest już dostępna odpowiedź w innym formacie.

Mam zestaw danych danych transakcji dla punktu sprzedaży detalicznej. Zmienne wraz z wyjaśnieniem to:

  • sekcja: sekcja sklepu, str;
  • nazwa_produktu: nazwa produktu, str;
  • odbiór: numer faktury, int;
  • kasjer, numer kasjera, int;
  • koszt: koszt przedmiotu, liczba zmiennoprzecinkowa;
  • data, w formacie MM / DD / RR, str;
  • czas, w formacie GG: MM: SS, str;

Paragon ma tę samą wartość dla wszystkich produktów zakupionych w jednej transakcji, dlatego można go użyć do ustalenia średniej liczby zakupów dokonanych w jednej transakcji.

Jak najlepiej to zrobić? Zasadniczo chcę użyć groupby()do zgrupowania zmiennej pokwitowania według jej identycznych wystąpień, aby móc utworzyć histogram.

Praca z danymi w pandach DataFrame.

EDYTOWAĆ:

Oto kilka przykładowych danych z nagłówkiem (nazwa_produktu to tak naprawdę liczba szesnastkowa):

 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 

Z tego przykładowego zestawu oczekiwałbym histogramu pokwitowania, który pokazuje dwa wystąpienia pokwitowania 102857 (ponieważ ta osoba kupiła dwa przedmioty w jednej transakcji) i jedno wystąpienie odpowiednio pokwitowania 102856 i pokwitowania 102858. Uwaga: mój zestaw danych nie jest ogromny, około 1 milion wierszy.

nowy_analityk
źródło
Gotowe, dodano kilka przykładowych danych.
new_analyst

Odpowiedzi:

15

Z tego zestawu próbek oczekiwałbym histogramu pokwitowania, który pokazuje dwa wystąpienia pokwitowania 102857 (ponieważ ta osoba kupiła dwa przedmioty w jednej transakcji) i jedno wystąpienie odpowiednio pokwitowania 102856 i pokwitowania 102858.

Więc chcesz:

df.groupby („pokwitowanie”). rece.count ()

receipt
102856    1
102857    2
102858    1
Name: receipt, dtype: int64
Emre
źródło
ponieważ wynik nie jest już ramką danych, w jaki sposób filtrujemy to, aby wyświetlać tylko wartości, które mają więcej niż 1?
Nikhil VJ
1
Nadal można robić takie rzeczy jak s[s>1], gdzies=df.groupby('receipt').receipt.count()
Emre
2

Przygotowuję tutoriale dotyczące przekłamywania danych. Może mój notatnik jupyter na githubie pomoże. Myślę, że kluczem jest zmiana linii:

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

być:

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

Aby pogrupować według wielu zmiennych, powinno to działać:

df.groupby(['reciept','date'])['reciept'].count()
Ryan
źródło
Dziękuję za to. Czasami jednak odbiór jest powtarzany (gdy data jest również inna). Dlatego agregujemy wszystkie różne przypadki otrzymania, nawet w różnych terminach, kiedy naprawdę chcemy poznać liczbę otrzymanych transakcji - jednak nie ma unikalnej zmiennej identyfikatora transakcji. Nie sądzę, aby pokwitowanie powtarza się tego samego dnia - czy możemy użyć daty jako sposobu grupowania? df.groupby('reciept')['date'].count()daje taki sam wynik jakdf.groupby('reciept')['prod_name'].count()
new_analyst 22.04.16
Dodaj datę jako parametr wewnątrz połączenia grupowego. Edytowałem moją odpowiedź powyżej, aby pogrupować według wielu zmiennych.
Ryan
0

Z tego, co rozumiem, potrzebuję histogramu paragonu nr. Możesz spróbować czegoś takiego

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()

To da Ci wykresy słupkowe z najczęściej powtarzającymi się numerami rozliczeniowymi (20 najczęściej powtarzających się). Zmień liczbę w funkcji głowy, aby uzyskać więcej lub mniej.

Bharath KN
źródło