Skip to content

Commit 6e252a6

Browse files
author
Jiang Yue
committed
infer integer-na in infer_dtype
1 parent 269d368 commit 6e252a6

File tree

5 files changed

+31
-5
lines changed

5 files changed

+31
-5
lines changed

pandas/_libs/lib.pyx

+23-2
Original file line numberDiff line numberDiff line change
@@ -1250,7 +1250,10 @@ def infer_dtype(value: object, skipna: object=None) -> str:
12501250
if is_integer_array(values):
12511251
return 'integer'
12521252
elif is_integer_float_array(values):
1253-
return 'mixed-integer-float'
1253+
if is_integer_na_array(values):
1254+
return 'integer-na'
1255+
else:
1256+
return 'mixed-integer-float'
12541257
return 'mixed-integer'
12551258

12561259
elif PyDateTime_Check(val):
@@ -1275,7 +1278,10 @@ def infer_dtype(value: object, skipna: object=None) -> str:
12751278
if is_float_array(values):
12761279
return 'floating'
12771280
elif is_integer_float_array(values):
1278-
return 'mixed-integer-float'
1281+
if is_integer_na_array(values):
1282+
return 'integer-na'
1283+
else:
1284+
return 'mixed-integer-float'
12791285

12801286
elif util.is_bool_object(val):
12811287
if is_bool_array(values, skipna=skipna):
@@ -1511,6 +1517,21 @@ cpdef bint is_integer_array(ndarray values):
15111517
return validator.validate(values)
15121518

15131519

1520+
cdef class IntegerNaValidator(Validator):
1521+
cdef inline bint is_value_typed(self, object value) except -1:
1522+
return util.is_integer_object(value) or util.is_nan(value)
1523+
1524+
cdef inline bint is_array_typed(self) except -1:
1525+
return issubclass(self.dtype.type, np.integer)
1526+
1527+
1528+
cdef bint is_integer_na_array(ndarray values):
1529+
cdef:
1530+
IntegerNaValidator validator = IntegerNaValidator(len(values),
1531+
values.dtype)
1532+
return validator.validate(values)
1533+
1534+
15141535
cdef class IntegerFloatValidator(Validator):
15151536
cdef inline bint is_value_typed(self, object value) except -1:
15161537
return util.is_integer_object(value) or util.is_float_object(value)

pandas/core/arrays/integer.py

+1
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ def coerce_to_array(values, dtype, mask=None, copy=False):
186186
"floating",
187187
"integer",
188188
"mixed-integer",
189+
"integer-na",
189190
"mixed-integer-float",
190191
]:
191192
raise TypeError(

pandas/core/indexes/base.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ def __new__(
472472
pass
473473

474474
return Index(subarr, copy=copy, dtype=object, name=name)
475-
elif inferred in ["floating", "mixed-integer-float"]:
475+
elif inferred in ["floating", "mixed-integer-float", "integer-na"]:
476476
from .numeric import Float64Index
477477

478478
return Float64Index(subarr, copy=copy, name=name)
@@ -1810,7 +1810,7 @@ def is_integer(self):
18101810
return self.inferred_type in ["integer"]
18111811

18121812
def is_floating(self):
1813-
return self.inferred_type in ["floating", "mixed-integer-float"]
1813+
return self.inferred_type in ["floating", "mixed-integer-float", "integer-na"]
18141814

18151815
def is_numeric(self):
18161816
return self.inferred_type in ["integer", "floating"]
@@ -3119,6 +3119,7 @@ def _convert_scalar_indexer(self, key, kind=None):
31193119
if self.inferred_type not in [
31203120
"floating",
31213121
"mixed-integer-float",
3122+
"integer-na",
31223123
"string",
31233124
"unicode",
31243125
"mixed",
@@ -3196,7 +3197,8 @@ def is_int(v):
31963197
self.get_loc(stop)
31973198
is_positional = False
31983199
except KeyError:
3199-
if self.inferred_type == "mixed-integer-float":
3200+
if (self.inferred_type == "mixed-integer-float" or
3201+
self.inferred_type == "integer-na"):
32003202
raise
32013203

32023204
if is_null_slicer:

pandas/core/indexes/datetimes.py

+1
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,7 @@ def join(self, other, how="left", level=None, return_indexers=False, sort=False)
778778
not in (
779779
"floating",
780780
"integer",
781+
"integer-na",
781782
"mixed-integer",
782783
"mixed-integer-float",
783784
"mixed",

pandas/core/indexes/timedeltas.py

+1
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,7 @@ def _is_convertible_to_index(other):
727727
"floating",
728728
"mixed-integer",
729729
"integer",
730+
"integer-na",
730731
"mixed-integer-float",
731732
"mixed",
732733
):

0 commit comments

Comments
 (0)