@@ -36,7 +36,7 @@ cdef value_count_{{dtype}}(ndarray[{{dtype}}] values, bint dropna, const uint8_t
36
36
cdef value_count_{{dtype}}(const {{dtype}}_t[:] values, bint dropna, const uint8_t[:] mask=None):
37
37
{{endif}}
38
38
cdef:
39
- Py_ssize_t i = 0, na_counter = 0, na_add = 0
39
+ Py_ssize_t i = 0
40
40
Py_ssize_t n = len(values)
41
41
kh_{{ttype}}_t *table
42
42
@@ -49,6 +49,9 @@ cdef value_count_{{dtype}}(const {{dtype}}_t[:] values, bint dropna, const uint8
49
49
bint uses_mask = mask is not None
50
50
bint isna_entry = False
51
51
52
+ if uses_mask and not dropna:
53
+ raise NotImplementedError("uses_mask not implemented with dropna=False")
54
+
52
55
# we track the order in which keys are first seen (GH39009),
53
56
# khash-map isn't insertion-ordered, thus:
54
57
# table maps keys to counts
@@ -79,31 +82,25 @@ cdef value_count_{{dtype}}(const {{dtype}}_t[:] values, bint dropna, const uint8
79
82
for i in range(n):
80
83
val = {{to_c_type}}(values[i])
81
84
82
- if uses_mask:
83
- isna_entry = mask[i]
84
-
85
85
if dropna:
86
- if not uses_mask:
86
+ if uses_mask:
87
+ isna_entry = mask[i]
88
+ else:
87
89
isna_entry = is_nan_{{c_type}}(val)
88
90
89
91
if not dropna or not isna_entry:
90
- if uses_mask and isna_entry:
91
- na_counter += 1
92
+ k = kh_get_{{ttype}}(table, val)
93
+ if k != table.n_buckets:
94
+ table.vals[k] += 1
92
95
else:
93
- k = kh_get_{{ttype}}(table, val)
94
- if k != table.n_buckets:
95
- table.vals[k] += 1
96
- else:
97
- k = kh_put_{{ttype}}(table, val, &ret)
98
- table.vals[k] = 1
99
- result_keys.append(val)
96
+ k = kh_put_{{ttype}}(table, val, &ret)
97
+ table.vals[k] = 1
98
+ result_keys.append(val)
100
99
{{endif}}
101
100
102
101
# collect counts in the order corresponding to result_keys:
103
- if na_counter > 0:
104
- na_add = 1
105
102
cdef:
106
- int64_t[::1] result_counts = np.empty(table.size + na_add , dtype=np.int64)
103
+ int64_t[::1] result_counts = np.empty(table.size, dtype=np.int64)
107
104
108
105
for i in range(table.size):
109
106
{{if dtype == 'object'}}
@@ -113,13 +110,9 @@ cdef value_count_{{dtype}}(const {{dtype}}_t[:] values, bint dropna, const uint8
113
110
{{endif}}
114
111
result_counts[i] = table.vals[k]
115
112
116
- if na_counter > 0:
117
- result_counts[table.size] = na_counter
118
- result_keys.append(val)
119
-
120
113
kh_destroy_{{ttype}}(table)
121
114
122
- return result_keys.to_array(), result_counts.base, na_counter
115
+ return result_keys.to_array(), result_counts.base
123
116
124
117
125
118
@cython.wraparound(False)
@@ -406,10 +399,10 @@ def mode(ndarray[htfunc_t] values, bint dropna, const uint8_t[:] mask=None):
406
399
ndarray[htfunc_t] modes
407
400
408
401
int64_t[::1] counts
409
- int64_t count, _, max_count = -1
402
+ int64_t count, max_count = -1
410
403
Py_ssize_t nkeys, k, j = 0
411
404
412
- keys, counts, _ = value_count(values, dropna, mask=mask)
405
+ keys, counts = value_count(values, dropna, mask=mask)
413
406
nkeys = len(keys)
414
407
415
408
modes = np.empty(nkeys, dtype=values.dtype)
0 commit comments