วิธีใดที่มีประสิทธิภาพที่สุดในการนับจำนวนเหตุการณ์ในหมีแพนด้า


131

ฉันมี dataframe df ขนาดใหญ่ (ประมาณ 12M แถว) พร้อมกับพูดว่า:

df.columns = ['word','documents','frequency']

ดังนั้นสิ่งต่อไปนี้จึงดำเนินไปอย่างทันท่วงที:

word_grouping = df[['word','frequency']].groupby('word')
MaxFrequency_perWord = word_grouping[['frequency']].max().reset_index()
MaxFrequency_perWord.columns = ['word','MaxFrequency']

อย่างไรก็ตามการดำเนินการนี้ใช้เวลานานโดยไม่คาดคิด:

Occurrences_of_Words = word_grouping[['word']].count().reset_index()

ฉันทำอะไรผิดที่นี่? มีวิธีที่ดีกว่าในการนับจำนวนเหตุการณ์ที่เกิดขึ้นในดาต้าเฟรมขนาดใหญ่หรือไม่?

df.word.describe()

ทำงานได้ดีดังนั้นฉันจึงไม่คาดว่าดาต้าเฟรมของ Occurrences_of_Words นี้จะใช้เวลาสร้างนานมาก

ps: หากคำตอบชัดเจนและคุณรู้สึกว่าจำเป็นต้องลงโทษฉันที่ถามคำถามนี้โปรดใส่คำตอบด้วย ขอบคุณ.

คำตอบ:


237

ฉันคิดว่าdf['word'].value_counts()ควรให้บริการ การข้ามเครื่องจักรแบบกลุ่มจะช่วยประหยัดเวลาได้ ฉันไม่แน่ใจว่าทำไมควรจะได้ช้ากว่าcount maxทั้งสองใช้เวลาพอสมควรเพื่อหลีกเลี่ยงค่าที่ขาดหายไป (เปรียบเทียบกับsize.)

ไม่ว่าในกรณีใด value_counts ได้รับการปรับให้เหมาะสมโดยเฉพาะเพื่อจัดการกับประเภทวัตถุเช่นคำพูดของคุณดังนั้นฉันสงสัยว่าคุณจะทำได้ดีกว่านั้นมาก


25
ขอบคุณ ฉันยังพบว่าสิ่งนี้มีประโยชน์สำหรับการเร่งการนับค่าเฉพาะในซีรีส์ เช่นเป็นเรื่องเกี่ยวกับรวดเร็วเป็นสองเท่าdf.word.value_counts()['myword'] len(df[df.word == 'myword'])
fantabolous

สิ่งที่เกี่ยวกับการนับใน DataFrame ทั้งหมด? ใช้ได้กับคอลัมน์เดียว
Vaidøtas I.

2
เพื่อตอบคำถามของฉันเอง (คิดออก): .stack () function
Vaidøtas I.

@ VaidøtasIvøškaฉันพยายามดิ้นรนว่าจะใช้มันอย่างไร ช่วยยกตัวอย่างได้ไหม จะเกิดอะไรขึ้นถ้า 'myword' ไม่อยู่ในคอลัมน์? จากนั้นจะเพิ่ม KeyError
Newbielp

2
@Newbielp ฉันทำสิ่งนี้: df [[i สำหรับ i ใน column_names]]. astype ('str'). stack (). value_counts (). sum () ซึ่งเท่ากับการตั้งค่าแต่ละคอลัมน์ที่เลือกเป็นประเภท str โดยเรียงซ้อนกันทั้งหมด คอลัมน์ด้านบนสร้างโดยพื้นฐานหนึ่งคอลัมน์จากนั้นทำ value_counts () และ sum () ในคอลัมน์นั้น :) Stack มีประโยชน์มากมันอาจไม่ใช่ตัวเลือกที่ชัดเจนที่สุด แต่ใช้งานได้ดีสำหรับกรณีการใช้งานของฉัน :)
Vaidøtas I.

19

เมื่อคุณต้องการนับความถี่ของข้อมูลหมวดหมู่ในคอลัมน์ในการใช้ dataFrame ของแพนด้า: df['Column_Name'].value_counts()

- ที่มา .


11

เพียงเพิ่มเติมจากคำตอบก่อนหน้านี้ อย่าลืมว่าเมื่อจัดการกับข้อมูลจริงอาจมีค่าว่างดังนั้นจึงมีประโยชน์ที่จะรวมค่าเหล่านั้นไว้ในการนับโดยใช้ตัวเลือกdropna=False( ค่าเริ่มต้นคือTrue )

ตัวอย่าง:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.