-
-
Notifications
You must be signed in to change notification settings - Fork 19k
Gh 36562 typeerror comparison not supported between float and str #37096
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
1320ff1
a1b9385
1f76d21
7076841
225675d
2677166
6f476bc
3688238
aba429c
8ae9279
dd5a38d
7b7d6f8
4226662
8cbfa01
6d71000
92e1e33
3ada9ce
95670f1
d9dcd22
66c30c7
db66528
16ae4f4
9d03dc3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ | |
""" | ||
from __future__ import annotations | ||
|
||
import functools | ||
import operator | ||
from textwrap import dedent | ||
from typing import TYPE_CHECKING, Dict, Optional, Tuple, Union, cast | ||
|
@@ -2055,13 +2056,50 @@ def sort_mixed(values): | |
strs = np.sort(values[str_pos]) | ||
return np.concatenate([nums, np.asarray(strs, dtype=object)]) | ||
|
||
def sort_tuples(values): | ||
|
||
# sorts tuples with mixed values. can handle nan vs string comparisons. | ||
def cmp_func(index_x, index_y): | ||
|
||
x = values[index_x] | ||
y = values[index_y] | ||
# shortcut loop in case both tuples are the same | ||
|
||
if x == y: | ||
return 0 | ||
# lexicographic sorting | ||
for i in range(max(len(x), len(y))): | ||
# check if the tuples have different lengths (shorter tuples | ||
# first) | ||
if i >= len(x): | ||
return -1 | ||
if i >= len(y): | ||
return +1 | ||
x_is_na = isna(x[i]) | ||
y_is_na = isna(y[i]) | ||
# values are the same -> resolve tie with next element | ||
if (x_is_na and y_is_na) or (x[i] == y[i]): | ||
continue | ||
# check for nan values (sort nan to the end) | ||
if x_is_na and not y_is_na: | ||
return +1 | ||
if not x_is_na and y_is_na: | ||
return -1 | ||
# normal greater/less than comparison | ||
if x[i] < y[i]: | ||
return -1 | ||
return +1 | ||
# both values are the same (should already have been caught) | ||
return 0 | ||
|
||
ixs = np.arange(len(values)) | ||
ixs = sorted(ixs, key=functools.cmp_to_key(cmp_func)) | ||
return values[ixs] | ||
|
||
sorter = None | ||
if ( | ||
not is_extension_array_dtype(values) | ||
and lib.infer_dtype(values, skipna=False) == "mixed-integer" | ||
): | ||
# unorderable in py3 if mixed str/int | ||
|
||
is_ea = is_extension_array_dtype(values) | ||
if not is_ea and lib.infer_dtype(values, skipna=False) == "mixed-integer": | ||
ordered = sort_mixed(values) | ||
elif not is_ea and values.size and isinstance(values[0], tuple): | ||
ordered = sort_tuples(values) | ||
else: | ||
try: | ||
sorter = values.argsort() | ||
|
Uh oh!
There was an error while loading. Please reload this page.