apa cara paling efisien untuk menghitung kejadian di panda?

131

Saya memiliki dataframe df besar (sekitar 12M baris) dengan mengatakan:

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

Jadi yang berikut ini berjalan tepat waktu:

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

Namun, ini membutuhkan waktu lama untuk dijalankan:

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

Apa yang saya lakukan salah di sini? Apakah ada cara yang lebih baik untuk menghitung kejadian dalam kerangka data yang besar?

df.word.describe()

berjalan cukup baik, jadi saya benar-benar tidak mengharapkan kerangka data Occurrences_of_Words ini membutuhkan waktu lama untuk dibangun.

ps: Jika jawabannya jelas dan Anda merasa perlu menghukum saya karena mengajukan pertanyaan ini, harap sertakan juga jawabannya. Terima kasih.

tipanverella
sumber

Jawaban:

235

Saya pikir df['word'].value_counts()harus melayani. Dengan melewatkan grup melalui mesin, Anda akan menghemat waktu. Saya tidak yakin mengapa countharus jauh lebih lambat daripada max. Keduanya membutuhkan waktu untuk menghindari nilai yang hilang. (Bandingkan dengan size.)

Bagaimanapun, value_counts telah dioptimalkan secara khusus untuk menangani jenis objek, seperti kata-kata Anda, jadi saya ragu Anda akan melakukan jauh lebih baik dari itu.

Dan Allan
sumber
25
Terima kasih. Saya juga menemukan ini berguna untuk mempercepat penghitungan nilai tertentu dalam suatu seri. misalnya df.word.value_counts()['myword']sekitar dua kali lebih cepat len(df[df.word == 'myword']).
fantabolous
Bagaimana dengan menghitung seluruh DataFrame? Ini berfungsi untuk satu kolom.
Vaidøtas I.
2
Untuk menjawab pertanyaan saya sendiri (menemukan jawabannya): fungsi .stack ()
Vaidøtas I.
@ Vaidøtas Ivøška, saya telah berjuang bagaimana menggunakannya. Bisakah Anda memberi contoh? Bagaimana jika 'kata saya' tidak ada di kolom? Kemudian memunculkan KeyError.
Newbielp
2
@Newbielp, saya melakukan ini: df [[i for i in column_names]]. Astype ('str'). Stack (). Value_counts (). Jumlah () yang sama dengan mengatur setiap kolom yang dipilih untuk jenis str, menumpuk semua individu kolom di atas, pada dasarnya membentuk satu kolom dan kemudian melakukan value_counts () dan jumlah () pada satu kolom itu. :) Stack cukup berguna, mungkin bukan pilihan yang paling jelas, tetapi bekerja seperti pesona untuk kasus penggunaan saya :)
Vaidøtas I.
19

Saat Anda ingin menghitung frekuensi data kategorikal dalam kolom di panda dataFrame, gunakan: df['Column_Name'].value_counts()

- Sumber .

Dwaraka Uttarkar
sumber
11

Hanya tambahan untuk jawaban sebelumnya. Jangan lupa bahwa ketika berhadapan dengan data nyata mungkin ada nilai nol, jadi ada baiknya juga menyertakan nilai tersebut dalam penghitungan dengan menggunakan opsi dropna=False( standarnya adalahTrue )

Sebuah contoh:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
pengguna2314737
sumber