Bagaimana mengelompokkan nilai-nilai identik dan menghitung frekuensinya dalam Python?


10

Pemula analitik dengan Python jadi harap bersikap lembut :-) Saya tidak dapat menemukan jawaban untuk pertanyaan ini - permintaan maaf jika sudah dijawab di tempat lain dalam format yang berbeda.

Saya memiliki dataset data transaksi untuk outlet ritel. Variabel beserta penjelasannya adalah:

  • bagian: bagian toko, str;
  • prod_name: nama produk, str;
  • tanda terima: jumlah faktur, int;
  • kasir, jumlah kasir, int;
  • biaya: biaya barang, pelampung;
  • tanggal, dalam format MM / DD / YY, str;
  • waktu, dalam format HH: MM: SS, str;

Kwitansi memiliki nilai yang sama untuk semua produk yang dibeli dalam satu transaksi, sehingga dapat digunakan untuk menentukan jumlah rata-rata pembelian yang dilakukan dalam satu transaksi.

Apa cara terbaik untuk masalah ini? Saya pada dasarnya ingin menggunakan groupby()untuk mengelompokkan variabel penerimaan dengan kejadian identik sendiri sehingga saya dapat membuat histogram.

Bekerja dengan data dalam panda DataFrame.

EDIT:

Berikut adalah beberapa contoh data dengan header (prod_name sebenarnya adalah nomor hex):

 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 

Dari set sampel ini saya akan mengharapkan histogram tanda terima yang menunjukkan dua kejadian penerimaan 102857 (karena orang itu membeli dua item dalam satu transaksi) dan satu kejadian masing-masing penerimaan 102856 dan penerimaan 102858. Catatan: dataset saya tidak besar, sekitar 1 juta baris.


Selesai, tambahkan beberapa data sampel.
new_analyst

Jawaban:


15

Dari set sampel ini saya akan mengharapkan histogram penerimaan yang menunjukkan dua kejadian penerimaan 102857 (karena orang itu membeli dua item dalam satu transaksi) dan satu kejadian masing-masing penerimaan 102856 dan penerimaan 102858.

Maka Anda ingin:

df.groupby ('struk'). struk.count ()

receipt
102856    1
102857    2
102858    1
Name: receipt, dtype: int64

karena hasilnya bukan lagi kerangka data, bagaimana kita memfilter ini untuk hanya menampilkan nilai yang memiliki hitungan lebih dari 1?
Nikhil VJ

1
Anda masih dapat melakukan hal-hal seperti s[s>1], di manas=df.groupby('receipt').receipt.count()
Emre

2

Saya menyusun beberapa tutorial seputar pertengkaran data. Mungkin notebook jupyter saya di github akan membantu. Saya pikir kuncinya adalah memodifikasi garis:

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

menjadi:

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

Untuk mengelompokkan berdasarkan beberapa variabel ini harus berfungsi:

df.groupby(['reciept','date'])['reciept'].count()

Terima kasih untuk itu. Namun, kadang-kadang tanda terima diulangi (ketika tanggalnya berbeda juga). Oleh karena itu, kami menggabungkan semua kejadian penerimaan yang berbeda bahkan pada tanggal yang berbeda, ketika kami benar-benar ingin mengetahui jumlah tanda terima berdasarkan transaksi - namun tidak ada variabel ID transaksi yang unik. Saya tidak berpikir penerimaan berulang pada hari yang sama - dapatkah kita menggunakan tanggal sebagai cara untuk mengelompokkan? df.groupby('reciept')['date'].count()memberikan hasil yang sama dengandf.groupby('reciept')['prod_name'].count()
new_analyst

Tambahkan tanggal sebagai parameter di dalam panggilan grup oleh. Diedit jawaban saya di atas untuk dikelompokkan oleh banyak vars.
Ryan

0

Dari apa yang saya mengerti adalah bahwa Anda akan memerlukan histogram tanda terima Anda. Anda dapat mencoba sesuatu seperti ini

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

Ini akan memberi Anda plot bar nomor penagihan paling berulang (20 paling berulang) Ubah angka di fungsi kepala untuk mendapatkan lebih atau kurang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.