Skip to content

Commit 04c3e81

Browse files
Backport PR #60796 on branch 2.3.x (BUG: is_*_array returns true on empty object dtype) (#60808)
Backport PR #60796: BUG: is_*_array returns true on empty object dtype Co-authored-by: Richard Shadrach <[email protected]>
1 parent 1e48798 commit 04c3e81

File tree

2 files changed

+43
-18
lines changed

2 files changed

+43
-18
lines changed

pandas/_libs/lib.pyx

+18-18
Original file line numberDiff line numberDiff line change
@@ -1846,7 +1846,7 @@ cdef class BoolValidator(Validator):
18461846

18471847
cpdef bint is_bool_array(ndarray values, bint skipna=False):
18481848
cdef:
1849-
BoolValidator validator = BoolValidator(len(values),
1849+
BoolValidator validator = BoolValidator(values.size,
18501850
values.dtype,
18511851
skipna=skipna)
18521852
return validator.validate(values)
@@ -1864,7 +1864,7 @@ cdef class IntegerValidator(Validator):
18641864
# Note: only python-exposed for tests
18651865
cpdef bint is_integer_array(ndarray values, bint skipna=True):
18661866
cdef:
1867-
IntegerValidator validator = IntegerValidator(len(values),
1867+
IntegerValidator validator = IntegerValidator(values.size,
18681868
values.dtype,
18691869
skipna=skipna)
18701870
return validator.validate(values)
@@ -1879,7 +1879,7 @@ cdef class IntegerNaValidator(Validator):
18791879

18801880
cdef bint is_integer_na_array(ndarray values, bint skipna=True):
18811881
cdef:
1882-
IntegerNaValidator validator = IntegerNaValidator(len(values),
1882+
IntegerNaValidator validator = IntegerNaValidator(values.size,
18831883
values.dtype, skipna=skipna)
18841884
return validator.validate(values)
18851885

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

18961896
cdef bint is_integer_float_array(ndarray values, bint skipna=True):
18971897
cdef:
1898-
IntegerFloatValidator validator = IntegerFloatValidator(len(values),
1898+
IntegerFloatValidator validator = IntegerFloatValidator(values.size,
18991899
values.dtype,
19001900
skipna=skipna)
19011901
return validator.validate(values)
@@ -1913,7 +1913,7 @@ cdef class FloatValidator(Validator):
19131913
# Note: only python-exposed for tests
19141914
cpdef bint is_float_array(ndarray values):
19151915
cdef:
1916-
FloatValidator validator = FloatValidator(len(values), values.dtype)
1916+
FloatValidator validator = FloatValidator(values.size, values.dtype)
19171917
return validator.validate(values)
19181918

19191919

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

19321932
cdef bint is_complex_array(ndarray values):
19331933
cdef:
1934-
ComplexValidator validator = ComplexValidator(len(values), values.dtype)
1934+
ComplexValidator validator = ComplexValidator(values.size, values.dtype)
19351935
return validator.validate(values)
19361936

19371937

@@ -1944,7 +1944,7 @@ cdef class DecimalValidator(Validator):
19441944
cdef bint is_decimal_array(ndarray values, bint skipna=False):
19451945
cdef:
19461946
DecimalValidator validator = DecimalValidator(
1947-
len(values), values.dtype, skipna=skipna
1947+
values.size, values.dtype, skipna=skipna
19481948
)
19491949
return validator.validate(values)
19501950

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

19611961
cpdef bint is_string_array(ndarray values, bint skipna=False):
19621962
cdef:
1963-
StringValidator validator = StringValidator(len(values),
1963+
StringValidator validator = StringValidator(values.size,
19641964
values.dtype,
19651965
skipna=skipna)
19661966
return validator.validate(values)
@@ -1977,7 +1977,7 @@ cdef class BytesValidator(Validator):
19771977

19781978
cdef bint is_bytes_array(ndarray values, bint skipna=False):
19791979
cdef:
1980-
BytesValidator validator = BytesValidator(len(values), values.dtype,
1980+
BytesValidator validator = BytesValidator(values.size, values.dtype,
19811981
skipna=skipna)
19821982
return validator.validate(values)
19831983

@@ -2028,7 +2028,7 @@ cdef class DatetimeValidator(TemporalValidator):
20282028

20292029
cpdef bint is_datetime_array(ndarray values, bint skipna=True):
20302030
cdef:
2031-
DatetimeValidator validator = DatetimeValidator(len(values),
2031+
DatetimeValidator validator = DatetimeValidator(values.size,
20322032
skipna=skipna)
20332033
return validator.validate(values)
20342034

@@ -2042,7 +2042,7 @@ cdef class Datetime64Validator(DatetimeValidator):
20422042
# Note: only python-exposed for tests
20432043
cpdef bint is_datetime64_array(ndarray values, bint skipna=True):
20442044
cdef:
2045-
Datetime64Validator validator = Datetime64Validator(len(values),
2045+
Datetime64Validator validator = Datetime64Validator(values.size,
20462046
skipna=skipna)
20472047
return validator.validate(values)
20482048

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

20582058
cdef bint is_datetime_or_datetime64_array(ndarray values, bint skipna=True):
20592059
cdef:
2060-
AnyDatetimeValidator validator = AnyDatetimeValidator(len(values),
2060+
AnyDatetimeValidator validator = AnyDatetimeValidator(values.size,
20612061
skipna=skipna)
20622062
return validator.validate(values)
20632063

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

20752075
if n == 0:
@@ -2117,7 +2117,7 @@ cpdef bint is_timedelta_or_timedelta64_array(ndarray values, bint skipna=True):
21172117
Infer with timedeltas and/or nat/none.
21182118
"""
21192119
cdef:
2120-
AnyTimedeltaValidator validator = AnyTimedeltaValidator(len(values),
2120+
AnyTimedeltaValidator validator = AnyTimedeltaValidator(values.size,
21212121
skipna=skipna)
21222122
return validator.validate(values)
21232123

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

21372137

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

21502150

@@ -2195,14 +2195,14 @@ cpdef bint is_interval_array(ndarray values):
21952195
Is this an ndarray of Interval (or np.nan) with a single dtype?
21962196
"""
21972197
cdef:
2198-
Py_ssize_t i, n = len(values)
2198+
Py_ssize_t i, n = values.size
21992199
str closed = None
22002200
bint numeric = False
22012201
bint dt64 = False
22022202
bint td64 = False
22032203
object val
22042204

2205-
if len(values) == 0:
2205+
if n == 0:
22062206
return False
22072207

22082208
for i in range(n):

pandas/tests/dtypes/test_inference.py

+25
Original file line numberDiff line numberDiff line change
@@ -1585,6 +1585,31 @@ def test_is_string_array(self):
15851585
)
15861586
assert not lib.is_string_array(np.array([1, 2]))
15871587

1588+
@pytest.mark.parametrize(
1589+
"func",
1590+
[
1591+
"is_bool_array",
1592+
"is_date_array",
1593+
"is_datetime_array",
1594+
"is_datetime64_array",
1595+
"is_float_array",
1596+
"is_integer_array",
1597+
"is_interval_array",
1598+
"is_string_array",
1599+
"is_time_array",
1600+
"is_timedelta_or_timedelta64_array",
1601+
],
1602+
)
1603+
def test_is_dtype_array_empty_obj(self, func):
1604+
# https://github.com/pandas-dev/pandas/pull/60796
1605+
func = getattr(lib, func)
1606+
1607+
arr = np.empty((2, 0), dtype=object)
1608+
assert not func(arr)
1609+
1610+
arr = np.empty((0, 2), dtype=object)
1611+
assert not func(arr)
1612+
15881613
def test_to_object_array_tuples(self):
15891614
r = (5, 6)
15901615
values = [r]

0 commit comments

Comments
 (0)