@@ -463,6 +463,7 @@ def group_rank_{{name}}(ndarray[float64_t, ndim=2] out,
463
463
ndarray[{{c_type}}] _values
464
464
ndarray[uint8_t] mask
465
465
bint pct, ascending, keep_na
466
+ {{c_type}} nan_value
466
467
467
468
tiebreak = tiebreakers[kwargs['ties_method']]
468
469
ascending = kwargs['ascending']
@@ -471,19 +472,27 @@ def group_rank_{{name}}(ndarray[float64_t, ndim=2] out,
471
472
N, K = (<object> values).shape
472
473
473
474
_values = np.array(values[:, 0], copy=True)
475
+ {{if name=='int64'}}
476
+ mask = (_values == {{nan_val}}).astype(np.uint8)
477
+ {{else}}
474
478
mask = np.isnan(_values).astype(np.uint8)
479
+ {{endif}}
475
480
476
- {{if name == 'int64' }}
477
- order = (_values, labels)
478
- {{else}}
479
481
if ascending ^ (kwargs['na_option'] == 'top'):
482
+ {{if name == 'int64'}}
483
+ nan_value = np.iinfo(np.int64).max
484
+ {{else}}
480
485
nan_value = np.inf
486
+ {{endif}}
481
487
order = (_values, mask, labels)
482
488
else:
489
+ {{if name == 'int64'}}
490
+ nan_value = np.iinfo(np.int64).min
491
+ {{else}}
483
492
nan_value = -np.inf
493
+ {{endif}}
484
494
order = (_values, ~mask, labels)
485
495
np.putmask(_values, mask, nan_value)
486
- {{endif}}
487
496
488
497
_as = np.lexsort(order)
489
498
@@ -495,9 +504,9 @@ def group_rank_{{name}}(ndarray[float64_t, ndim=2] out,
495
504
dups += 1
496
505
sum_ranks += i - grp_start + 1
497
506
498
- if keep_na and (values [_as[i], 0] != values[_as[i], 0]) :
507
+ if keep_na and _values [_as[i]] == nan_value :
499
508
grp_na_count += 1
500
- out[_as[i], 0] = {{nan_val}}
509
+ out[_as[i], 0] = nan
501
510
else:
502
511
if tiebreak == TIEBREAK_AVERAGE:
503
512
for j in range(i - dups + 1, i + 1):
@@ -518,11 +527,19 @@ def group_rank_{{name}}(ndarray[float64_t, ndim=2] out,
518
527
for j in range(i - dups + 1, i + 1):
519
528
out[_as[j], 0] = vals_seen
520
529
530
+ {{if name=='int64'}}
531
+ if (i == N - 1 or (
532
+ (_values[_as[i]] != _values[_as[i+1]]) and not
533
+ (_values[_as[i]] == nan_value and
534
+ _values[_as[i+1]] == nan_value
535
+ ))):
536
+ {{else}}
521
537
if (i == N - 1 or (
522
538
(_values[_as[i]] != _values[_as[i+1]]) and not
523
539
(isnan(_values[_as[i]]) and
524
540
isnan(_values[_as[i+1]])
525
541
))):
542
+ {{endif}}
526
543
dups = sum_ranks = 0
527
544
val_start = i
528
545
vals_seen += 1
0 commit comments