パンダの発生を数える最も効率的な方法は何ですか?


131

私は言うと大規模な(約1200万行)データフレームdfがあります。

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:答えが明白で、この質問をすることでペナルティを課す必要があると感じた場合は、答えも含めてください。ありがとうございました。

回答:


235

df['word'].value_counts()役立つはずだと思います。groupby機構をスキップすることで、時間を節約できます。がにcount比べてはるかに遅くなる理由がわかりませんmax。どちらも欠損値を回避するために少し時間がかかります。(と比較してくださいsize。)

いずれにせよ、value_countsは単語などのオブジェクトタイプを処理するように特別に最適化されているので、それ以上のことはできないと思います。


25
ありがとう。また、これはシリーズの特定の値のカウントを高速化するのにも役立ちます。たとえばdf.word.value_counts()['myword']、の約2倍の速度len(df[df.word == 'myword'])です。
幻想的な2015年

DataFrame全体を数えますか?これは1つの列に対して機能します。
VaidøtasI.

2
自分の質問に答えるために(それを考え出した):.STACK()関数
VaidøtasI.

@VaidøtasIvøška、私はそれを使用する方法に苦労しています。例を挙げていただけますか?「myword」が列にない場合はどうなりますか?次に、KeyErrorが発生します。
Newbielp

2
@Newbielp、私はこれを行いました:df [[i_i in column_names]]。astype( 'str')。stack()。value_counts()。sum()これは、選択された各列をstr型に設定し、すべて個別にスタックします列を上に置き、基本的に1つの列を形成してから、その1つの列でvalue_counts()およびsum()を実行します。:)スタックはかなり便利です、それは最も明白な選択ではないかもしれませんが、私のユースケース:)のための魅力のように働いた
VaidøtasI.


10

前の回答への単なる追加。実際のデータを処理するときにnull値が存在する可能性があることを忘れないでください。そのため、オプションを使用してカウントにそれらも含めると便利です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.