packages/vaex-core/vaex/expression.py
def value_counts(self, dropna=False, dropnull=True, ascending=False, progress=False):
        """Computes counts of unique values.

         WARNING:
          * If the expression/column is not categorical, it will be converted on the fly
          * dropna is False by default, it is True by default in pandas

        :param dropna: when True, it will not report the missing values
        :param ascending: when False (default) it will report the most frequent occuring item first
        :returns: Pandas series containing the counts
        """
        from pandas import Series
        dtype = self.dtype

        transient = self.transient or self.ds.filtered or self.ds.is_masked(self.expression)
        if self.dtype == str_type and not transient:
            # string is a special case, only ColumnString are not transient
            ar = self.ds.columns[self.expression]
            if not isinstance(ar, ColumnString):
                transient = True

        counter_type = counter_type_from_dtype(self.dtype, transient)
        counters = [None] * self.ds.executor.thread_pool.nthreads
        def map(thread_index, i1, i2, ar):
            if counters[thread_index] is None:
                counters[thread_index] = counter_type()
            if dtype == str_type:
                previous_ar = ar
                ar = _to_string_sequence(ar)
                if not transient:
                    assert ar is previous_ar.string_sequence
            if np.ma.isMaskedArray(ar):
                mask = np.ma.getmaskarray(ar)
                counters[thread_index].update(ar, mask)
            else:
                counters[thread_index].update(ar)
            return 0
        def reduce(a, b):
            return a+b
        self.ds.map_reduce(map, reduce, [self.expression], delay=False, progress=progress, name='value_counts', info=True, to_numpy=False)
        counters = [k for k in counters if k is not None]
        counter0 = counters[0]
        for other in counters[1:]:
            counter0.merge(other)
        value_counts = counter0.extract()
        index = np.array(list(value_counts.keys()))
        counts = np.array(list(value_counts.values()))

        order = np.argsort(counts)
        if not ascending:
            order = order[::-1]
        counts = counts[order]
        index = index[order]
        if not dropna or not dropnull:
            index = index.tolist()
            counts = counts.tolist()
            if not dropna and counter0.nan_count:
                index = [np.nan] + index
                counts = [counter0.nan_count] + counts
            if not dropnull and counter0.null_count:
                index = ['null'] + index
                counts = [counter0.null_count] + counts

        return Series(counts, index=index)
def value_counts(self, dropna=False, dropnull=True, ascending=False, progress=False):
        from pandas import Series
        dtype = self.dtype

        transient = self.transient or self.ds.filtered or self.ds.is_masked(self.expression)
        if self.dtype == str_type and not transient:
            # string is a special case, only ColumnString are not transient
            ar = self.ds.columns[self.expression]
            if not isinstance(ar, ColumnString):
                transient = True

        counter_type = counter_type_from_dtype(self.dtype, transient)
        counters = [None] * self.ds.executor.thread_pool.nthreads
        def map(thread_index, i1, i2, ar):
            if counters[thread_index] is None:
                counters[thread_index] = counter_type()
            if dtype == str_type:
                previous_ar = ar
                ar = _to_string_sequence(ar)
                if not transient:
                    assert ar is previous_ar.string_sequence
            if np.ma.isMaskedArray(ar):
                mask = np.ma.getmaskarray(ar)
                counters[thread_index].update(ar, mask)
            else:
                counters[thread_index].update(ar)
            return 0
        def reduce(a, b):
            return a+b
        self.ds.map_reduce(map, reduce, [self.expression], delay=False, progress=progress, name='value_counts', info=True, to_numpy=False)
        counters = [k for k in counters if k is not None]
        counter0 = counters[0]
        for other in counters[1:]:
            counter0.merge(other)
        value_counts = counter0.extract()
        index = np.array(list(value_counts.keys()))
        counts = np.array(list(value_counts.values()))

        order = np.argsort(counts)
        if not ascending:
            order = order[::-1]
        counts = counts[order]
        index = index[order]
        if not dropna or not dropnull:
            index = index.tolist()
            counts = counts.tolist()
            if not dropna and counter0.nan_count:
                index = [np.nan] + index
                counts = [counter0.nan_count] + counts
            if not dropnull and counter0.null_count:
                index = ['null'] + index
                counts = [counter0.null_count] + counts

        return Series(counts, index=index)
def value_counts ( self , dropna = False , dropnull = True , ascending = False , progress = False ) : from pandas import Series dtype = self . dtype transient = self . transient or self . ds . filtered or self . ds . is_masked ( self . expression ) if self . dtype == str_type and not transient : # string is a special case, only ColumnString are not transient ar = self . ds . columns [ self . expression ] if not isinstance ( ar , ColumnString ) : transient = True counter_type = counter_type_from_dtype ( self . dtype , transient ) counters = [ None ] * self . ds . executor . thread_pool . nthreads def map ( thread_index , i1 , i2 , ar ) : if counters [ thread_index ] is None : counters [ thread_index ] = counter_type ( ) if dtype == str_type : previous_ar = ar ar = _to_string_sequence ( ar ) if not transient : assert ar is previous_ar . string_sequence if np . ma . isMaskedArray ( ar ) : mask = np . ma . getmaskarray ( ar ) counters [ thread_index ] . update ( ar , mask ) else : counters [ thread_index ] . update ( ar ) return 0 def reduce ( a , b ) : return a + b self . ds . map_reduce ( map , reduce , [ self . expression ] , delay = False , progress = progress , name = 'value_counts' , info = True , to_numpy = False ) counters = [ k for k in counters if k is not None ] counter0 = counters [ 0 ] for other in counters [ 1 : ] : counter0 . merge ( other ) value_counts = counter0 . extract ( ) index = np . array ( list ( value_counts . keys ( ) ) ) counts = np . array ( list ( value_counts . values ( ) ) ) order = np . argsort ( counts ) if not ascending : order = order [ : : - 1 ] counts = counts [ order ] index = index [ order ] if not dropna or not dropnull : index = index . tolist ( ) counts = counts . tolist ( ) if not dropna and counter0 . nan_count : index = [ np . nan ] + index counts = [ counter0 . nan_count ] + counts if not dropnull and counter0 . null_count : index = [ 'null' ] + index counts = [ counter0 . null_count ] + counts return Series ( counts , index = index )
Computes counts of unique values.

         WARNING:
          * If the expression/column is not categorical, it will be converted on the fly
          * dropna is False by default, it is True by default in pandas

        :param dropna: when True, it will not report the missing values
        :param ascending: when False (default) it will report the most frequent occuring item first
        :returns: Pandas series containing the counts
Computes counts of unique values .