Skip to content
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

Backport PR #60796 on branch 2.3.x (BUG: is_*_array returns true on empty object dtype) #60808

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions pandas/_libs/lib.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -1846,7 +1846,7 @@ cdef class BoolValidator(Validator):

cpdef bint is_bool_array(ndarray values, bint skipna=False):
cdef:
BoolValidator validator = BoolValidator(len(values),
BoolValidator validator = BoolValidator(values.size,
values.dtype,
skipna=skipna)
return validator.validate(values)
Expand All @@ -1864,7 +1864,7 @@ cdef class IntegerValidator(Validator):
# Note: only python-exposed for tests
cpdef bint is_integer_array(ndarray values, bint skipna=True):
cdef:
IntegerValidator validator = IntegerValidator(len(values),
IntegerValidator validator = IntegerValidator(values.size,
values.dtype,
skipna=skipna)
return validator.validate(values)
Expand All @@ -1879,7 +1879,7 @@ cdef class IntegerNaValidator(Validator):

cdef bint is_integer_na_array(ndarray values, bint skipna=True):
cdef:
IntegerNaValidator validator = IntegerNaValidator(len(values),
IntegerNaValidator validator = IntegerNaValidator(values.size,
values.dtype, skipna=skipna)
return validator.validate(values)

Expand All @@ -1895,7 +1895,7 @@ cdef class IntegerFloatValidator(Validator):

cdef bint is_integer_float_array(ndarray values, bint skipna=True):
cdef:
IntegerFloatValidator validator = IntegerFloatValidator(len(values),
IntegerFloatValidator validator = IntegerFloatValidator(values.size,
values.dtype,
skipna=skipna)
return validator.validate(values)
Expand All @@ -1913,7 +1913,7 @@ cdef class FloatValidator(Validator):
# Note: only python-exposed for tests
cpdef bint is_float_array(ndarray values):
cdef:
FloatValidator validator = FloatValidator(len(values), values.dtype)
FloatValidator validator = FloatValidator(values.size, values.dtype)
return validator.validate(values)


Expand All @@ -1931,7 +1931,7 @@ cdef class ComplexValidator(Validator):

cdef bint is_complex_array(ndarray values):
cdef:
ComplexValidator validator = ComplexValidator(len(values), values.dtype)
ComplexValidator validator = ComplexValidator(values.size, values.dtype)
return validator.validate(values)


Expand All @@ -1944,7 +1944,7 @@ cdef class DecimalValidator(Validator):
cdef bint is_decimal_array(ndarray values, bint skipna=False):
cdef:
DecimalValidator validator = DecimalValidator(
len(values), values.dtype, skipna=skipna
values.size, values.dtype, skipna=skipna
)
return validator.validate(values)

Expand All @@ -1960,7 +1960,7 @@ cdef class StringValidator(Validator):

cpdef bint is_string_array(ndarray values, bint skipna=False):
cdef:
StringValidator validator = StringValidator(len(values),
StringValidator validator = StringValidator(values.size,
values.dtype,
skipna=skipna)
return validator.validate(values)
Expand All @@ -1977,7 +1977,7 @@ cdef class BytesValidator(Validator):

cdef bint is_bytes_array(ndarray values, bint skipna=False):
cdef:
BytesValidator validator = BytesValidator(len(values), values.dtype,
BytesValidator validator = BytesValidator(values.size, values.dtype,
skipna=skipna)
return validator.validate(values)

Expand Down Expand Up @@ -2028,7 +2028,7 @@ cdef class DatetimeValidator(TemporalValidator):

cpdef bint is_datetime_array(ndarray values, bint skipna=True):
cdef:
DatetimeValidator validator = DatetimeValidator(len(values),
DatetimeValidator validator = DatetimeValidator(values.size,
skipna=skipna)
return validator.validate(values)

Expand All @@ -2042,7 +2042,7 @@ cdef class Datetime64Validator(DatetimeValidator):
# Note: only python-exposed for tests
cpdef bint is_datetime64_array(ndarray values, bint skipna=True):
cdef:
Datetime64Validator validator = Datetime64Validator(len(values),
Datetime64Validator validator = Datetime64Validator(values.size,
skipna=skipna)
return validator.validate(values)

Expand All @@ -2057,7 +2057,7 @@ cdef class AnyDatetimeValidator(DatetimeValidator):

cdef bint is_datetime_or_datetime64_array(ndarray values, bint skipna=True):
cdef:
AnyDatetimeValidator validator = AnyDatetimeValidator(len(values),
AnyDatetimeValidator validator = AnyDatetimeValidator(values.size,
skipna=skipna)
return validator.validate(values)

Expand All @@ -2069,7 +2069,7 @@ def is_datetime_with_singletz_array(values: ndarray) -> bool:
Doesn't check values are datetime-like types.
"""
cdef:
Py_ssize_t i = 0, j, n = len(values)
Py_ssize_t i = 0, j, n = values.size
object base_val, base_tz, val, tz

if n == 0:
Expand Down Expand Up @@ -2117,7 +2117,7 @@ cpdef bint is_timedelta_or_timedelta64_array(ndarray values, bint skipna=True):
Infer with timedeltas and/or nat/none.
"""
cdef:
AnyTimedeltaValidator validator = AnyTimedeltaValidator(len(values),
AnyTimedeltaValidator validator = AnyTimedeltaValidator(values.size,
skipna=skipna)
return validator.validate(values)

Expand All @@ -2131,7 +2131,7 @@ cdef class DateValidator(Validator):
# Note: only python-exposed for tests
cpdef bint is_date_array(ndarray values, bint skipna=False):
cdef:
DateValidator validator = DateValidator(len(values), skipna=skipna)
DateValidator validator = DateValidator(values.size, skipna=skipna)
return validator.validate(values)


Expand All @@ -2144,7 +2144,7 @@ cdef class TimeValidator(Validator):
# Note: only python-exposed for tests
cpdef bint is_time_array(ndarray values, bint skipna=False):
cdef:
TimeValidator validator = TimeValidator(len(values), skipna=skipna)
TimeValidator validator = TimeValidator(values.size, skipna=skipna)
return validator.validate(values)


Expand Down Expand Up @@ -2195,14 +2195,14 @@ cpdef bint is_interval_array(ndarray values):
Is this an ndarray of Interval (or np.nan) with a single dtype?
"""
cdef:
Py_ssize_t i, n = len(values)
Py_ssize_t i, n = values.size
str closed = None
bint numeric = False
bint dt64 = False
bint td64 = False
object val

if len(values) == 0:
if n == 0:
return False

for i in range(n):
Expand Down
25 changes: 25 additions & 0 deletions pandas/tests/dtypes/test_inference.py
Original file line number Diff line number Diff line change
Expand Up @@ -1585,6 +1585,31 @@ def test_is_string_array(self):
)
assert not lib.is_string_array(np.array([1, 2]))

@pytest.mark.parametrize(
"func",
[
"is_bool_array",
"is_date_array",
"is_datetime_array",
"is_datetime64_array",
"is_float_array",
"is_integer_array",
"is_interval_array",
"is_string_array",
"is_time_array",
"is_timedelta_or_timedelta64_array",
],
)
def test_is_dtype_array_empty_obj(self, func):
# https://github.com/pandas-dev/pandas/pull/60796
func = getattr(lib, func)

arr = np.empty((2, 0), dtype=object)
assert not func(arr)

arr = np.empty((0, 2), dtype=object)
assert not func(arr)

def test_to_object_array_tuples(self):
r = (5, 6)
values = [r]
Expand Down
Loading