计算大熊猫事件的最有效方法是什么?

tip*_*lla 104 python pandas

我有一个大的(大约12M行)数据帧df说:

df.columns = ['word','documents','frequency']
Run Code Online (Sandbox Code Playgroud)

所以以下内容及时进行:

word_grouping = df[['word','frequency']].groupby('word')
MaxFrequency_perWord = word_grouping[['frequency']].max().reset_index()
MaxFrequency_perWord.columns = ['word','MaxFrequency']
Run Code Online (Sandbox Code Playgroud)

但是,这需要很长时间才能运行:

Occurrences_of_Words = word_grouping[['word']].count().reset_index()
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?有没有更好的方法来计算大型数据框中的出现次数?

df.word.describe()
Run Code Online (Sandbox Code Playgroud)

运行得很好,所以我真的没想到这个Occurrences_of_Words数据帧需要很长时间才能构建.

ps:如果答案很明显,你觉得有必要惩罚我提出这个问题,请同时提供答案.谢谢.

Dan*_*lan 191

我认为df['word'].value_counts()应该服务.通过跳过groupby机器,你将节省一些时间.我不确定为什么count要慢得多max.两者都需要一些时间来避免缺失值.(比较size.)

在任何情况下,value_counts都经过专门优化处理对象类型,就像你的单词一样,所以我怀疑你会做得更好.

  • 谢谢.我还发现这对于加速计算系列中的特定值非常有用.例如``df.word.value_counts()['myword']`大约是`len(df [df.word =='myword'])`的两倍. (20认同)
  • 回答我自己的问题(弄清楚):.stack() 函数 (2认同)
  • @Newbielp,我这样做了: df[[i for i in column_names]].astype('str').stack().value_counts().sum() 相当于将每个选定的列设置为 str 类型,堆叠所有单独的列列在顶部,基本上形成一列,然后对该一列执行 value_counts() 和 sum() 。:) 堆栈非常有用,它可能不是最明显的选择,但对我的用例来说就像一个魅力:) (2认同)
  • 要添加到 @fantabolous' 注释,如果列中可能存在零值,请使用“.get()”方法。在这种情况下,“.get()”将返回“None”,而使用括号方法将引发错误。 (2认同)

小智 17

当您想要计算pandas dataFrame中列中分类数据的频率时,请使用: df['Column_Name'].value_counts()

- 来源.


use*_*737 8

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

一个例子:

>>> df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
Run Code Online (Sandbox Code Playgroud)