Làm cách nào để nhóm các giá trị giống hệt nhau và đếm tần số của chúng trong Python?


10

Người mới phân tích bằng Python vì vậy hãy nhẹ nhàng :-) Tôi không thể tìm thấy câu trả lời cho câu hỏi này - xin lỗi nếu nó đã được trả lời ở nơi khác ở định dạng khác.

Tôi có một bộ dữ liệu dữ liệu giao dịch cho một cửa hàng bán lẻ. Các biến cùng với lời giải thích là:

  • phần: phần của cửa hàng, một str;
  • prod_name: tên của sản phẩm, một str;
  • biên nhận: số hóa đơn, số nguyên;
  • thủ quỹ, số nhân viên thu ngân, một int;
  • chi phí: chi phí của mặt hàng, một phao;
  • ngày, ở định dạng MM / DD / YY, một str;
  • thời gian, ở định dạng HH: MM: SS, một str;

Biên lai có cùng giá trị cho tất cả các sản phẩm được mua trong một giao dịch, do đó, nó có thể được sử dụng để xác định số lượng mua trung bình được thực hiện trong một giao dịch.

cách tốt nhất để làm việc này là gì? Về cơ bản, tôi muốn sử dụng groupby()để nhóm biến biên nhận theo các lần xuất hiện giống hệt nhau để tôi có thể tạo biểu đồ.

Làm việc với dữ liệu trong DataFrame của gấu trúc.

BIÊN TẬP:

Dưới đây là một số dữ liệu mẫu có tiêu đề (prod_name thực sự là số 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 

Từ bộ mẫu này, tôi mong đợi một biểu đồ biên nhận cho thấy hai lần xuất hóa đơn 102857 (vì người đó đã mua hai mặt hàng trong một giao dịch) và một lần xuất hiện tương ứng của hóa đơn 102856 và biên nhận 102858. Lưu ý: tập dữ liệu của tôi không lớn, khoảng 1 triệu hàng.


Xong, thêm một số dữ liệu mẫu.
new_analyst

Câu trả lời:


15

Từ bộ mẫu này, tôi mong đợi một biểu đồ biên nhận cho thấy hai lần xuất hóa đơn 102857 (vì người đó đã mua hai mặt hàng trong một giao dịch) và một lần xuất hiện lần lượt là 102856 và nhận 102858.

Sau đó, bạn muốn:

df.groupby ('biên nhận'). receive.count ()

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

do kết quả không còn là khung dữ liệu, làm thế nào để chúng tôi lọc phần này để chỉ hiển thị các giá trị có số lượng nhiều hơn 1?
Nikhil VJ

1
Bạn vẫn có thể làm những việc như s[s>1], ở đâus=df.groupby('receipt').receipt.count()
Emre

2

Tôi đang tập hợp một số hướng dẫn xung quanh dữ liệu lộn xộn. Có lẽ máy tính xách tay jupyter của tôi trên github sẽ giúp. Tôi nghĩ rằng đó là chìa khóa đang sửa đổi dòng:

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

được:

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

Để nhóm theo nhiều biến, điều này sẽ hoạt động:

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

Cảm ơn vì điều đó. Tuy nhiên, đôi khi biên nhận được lặp lại (khi ngày cũng khác nhau). Do đó, chúng tôi đang tổng hợp tất cả các lần nhận khác nhau ngay cả vào các ngày khác nhau, khi chúng tôi thực sự muốn biết số lần nhận theo giao dịch - tuy nhiên không có biến ID giao dịch duy nhất. Tôi không nghĩ rằng việc nhận lại lặp lại trong cùng một ngày - chúng ta có thể sử dụng ngày như một cách để nhóm không? df.groupby('reciept')['date'].count()cho kết quả tương tự nhưdf.groupby('reciept')['prod_name'].count()
new_analyst

Thêm ngày dưới dạng tham số trong cuộc gọi nhóm. Chỉnh sửa câu trả lời của tôi ở trên để nhóm theo nhiều vars.
Ryan

0

Từ những gì tôi có thể hiểu là bạn sẽ cần một biểu đồ không. Bạn có thể thử một cái gì đó như thế này

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

Điều này sẽ cung cấp cho bạn các biểu đồ thanh của hầu hết các số thanh toán lặp lại (20 lần lặp lại nhiều nhất) Thay đổi số trong chức năng đầu để nhận được nhiều hơn hoặc ít hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.