在数据分析时,当我们需要统计一个数据集中的元素的出现次数时,对于pandas中的Series对象,直接有value_counts函数,会直接返回一个以元素为索引,出现次数为值的Series,如下图所示。
问题在于,如果数据集较大,而且其中的元素也不是int或者float等简单的对象,例如是列表、元组等对象,那么利用Series的value_counts对象是非常低效的,笔者试了一个由25000个列表组成的Series,用value_counts函数去计算,结果就卡死了。对此,我们可以用numpy的unique方法。
numpy.unique(arr, return_index=False, return_inverse=False, return_counts=False, axis=None)函数中,arr表示传入的ndarray,axis参数可以指定沿着哪个轴的元素进行对比,返回唯一的元素array对象unique,return_index如果为True,还会返回唯一值的元素第一次出现在ndarray中的索引;return_inverse为True的话,会返回原ndarray所有元素在返回的unique对象中的索引位置,此时可以通过unique[indices]进行重构原来的ndarray;如果return_counts为True,会返回每个元素出现的次数。如下所示。
因此,相比于Series的value_counts()函数,numpy.unique()函数可以让我们得到更多的信息,重点在于,numpy.unique函数的速度很快,对于之前的25000个列表组成的array,调用该函数在瞬间便可以返回结果。
如果数据集中的元素都是hashable的,通俗的讲就是不可变的,那么还可以利用python标准库collections中的Counter类来统计元素出现的次数,如下所示。返回一个Counter对象,可以以字典的方式查看元素的出现次数,还有一些方法可以进一步查看其性质,比如利用most_common([n])方法查看出现最频繁的前n个元素以及对应的次数,默认全部显示,并按出现次数从大到小排序。