计算大熊猫数量的最有效方法是什么?


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:如果答案很明显,并且您觉得有必要因提出这个问题而对我不利,请同时提供答案。谢谢。

Answers:


235

我认为df['word'].value_counts()应该服务。通过跳过groupby机制,您可以节省一些时间。我不知道为什么count要慢于max。两者都需要一些时间来避免丢失值。(与相比size。)

无论如何,对value_counts进行了专门优化以处理像您的单词这样的对象类型,因此我怀疑您会做得更好。


25
谢谢。我还发现这对于加快对系列中的特定值进行计数非常有用。例如df.word.value_counts()['myword']大约是速度的两倍len(df[df.word == 'myword'])
惊人的2015年

如何计算整个DataFrame呢?这适用于一列。
Vaidøtas一,

2
要回答我自己的问题(想通了):.STACK()函数
Vaidøtas一,

@VaidøtasIvøška,我一直在努力使用它。你能举个例子吗?如果“ myword”不在该列中怎么办?然后,它引发一个KeyError。
Newbielp

2
@Newbielp,我这样做:df [[i for column_names]]。astype('str')。stack()。value_counts()。sum()等同于将每个选定列设置为str类型,将所有单个列堆叠列的顶部,基本上形成一列,然后在该列上执行value_counts()和sum()。:)堆栈是非常有用的,它可能不是最明智的选择,但像我的用例:)一个魅力的工作
VaidøtasI.


11

只是先前答案的补充。别忘了,在处理实际数据时,可能会有空值,因此使用选项将默认值包括在内也很有用dropna=False默认值为True

一个例子:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.