จะจัดกลุ่มค่าที่เหมือนกันและนับความถี่ใน Python อย่างไร


10

มือใหม่ในการวิเคราะห์ด้วย Python ดังนั้นโปรดใช้ความสุภาพ :-) ฉันไม่สามารถหาคำตอบสำหรับคำถามนี้ได้ - ขออภัยหากมีคำตอบอยู่แล้วในรูปแบบอื่น

ฉันมีชุดข้อมูลการทำธุรกรรมสำหรับร้านค้าปลีก ตัวแปรพร้อมคำอธิบายคือ:

  • section: ส่วนของร้านค้า, str;
  • prod_name: ชื่อผลิตภัณฑ์, str;
  • ใบเสร็จรับเงิน: จำนวนของใบแจ้งหนี้, int;
  • แคชเชียร์จำนวนแคชเชียร์ int
  • ค่าใช้จ่าย: ค่าใช้จ่ายของรายการลอย;
  • วันที่ในรูปแบบ MM / DD / YY, str;
  • เวลาในรูปแบบ HH: MM: SS, a 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 (ใบเสร็จรับเงิน '). receipt.count ()

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

เนื่องจากผลลัพธ์ไม่ได้เป็น dataframe อีกต่อไปเราจะกรองสิ่งนี้เพื่อแสดงเฉพาะค่าที่มีจำนวนมากกว่า 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()

ขอบคุณสำหรับสิ่งนั้น อย่างไรก็ตามบางครั้งการรับซ้ำ (เมื่อวันที่แตกต่างกันเกินไป) ดังนั้นเราจึงรวมการรับที่แตกต่างกันทั้งหมดแม้ในวันที่ที่แตกต่างกันเมื่อเราต้องการทราบจำนวนการรับโดยธุรกรรม - อย่างไรก็ตามไม่มีตัวแปร ID ธุรกรรมที่ไม่ซ้ำกัน ฉันไม่คิดว่าการรับใบเสร็จซ้ำในวันเดียวกัน - เราสามารถใช้วันที่เป็นวิธีจัดกลุ่มได้หรือไม่? df.groupby('reciept')['date'].count()ให้ผลลัพธ์เหมือนกับdf.groupby('reciept')['prod_name'].count()
new_analyst

เพิ่มวันที่เป็นพารามิเตอร์ภายในการโทรแบบกลุ่ม แก้ไขคำตอบของฉันด้านบนเพื่อจัดกลุ่มโดยหลาย vars
Ryan

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 ครั้งที่สุด) เปลี่ยนหมายเลขในฟังก์ชั่นส่วนหัวเพื่อรับมากหรือน้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.