123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- import numpy as np
- import pytest
- import pandas as pd
- import pandas._testing as tm
- from pandas.api.indexers import check_array_indexer
- @pytest.mark.parametrize(
- "indexer, expected",
- [
- # integer
- ([1, 2], np.array([1, 2], dtype=np.intp)),
- (np.array([1, 2], dtype="int64"), np.array([1, 2], dtype=np.intp)),
- (pd.array([1, 2], dtype="Int32"), np.array([1, 2], dtype=np.intp)),
- (pd.Index([1, 2]), np.array([1, 2], dtype=np.intp)),
- # boolean
- ([True, False, True], np.array([True, False, True], dtype=np.bool_)),
- (np.array([True, False, True]), np.array([True, False, True], dtype=np.bool_)),
- (
- pd.array([True, False, True], dtype="boolean"),
- np.array([True, False, True], dtype=np.bool_),
- ),
- # other
- ([], np.array([], dtype=np.intp)),
- ],
- )
- def test_valid_input(indexer, expected):
- arr = np.array([1, 2, 3])
- result = check_array_indexer(arr, indexer)
- tm.assert_numpy_array_equal(result, expected)
- @pytest.mark.parametrize(
- "indexer", [[True, False, None], pd.array([True, False, None], dtype="boolean")]
- )
- def test_boolean_na_returns_indexer(indexer):
- # https://github.com/pandas-dev/pandas/issues/31503
- arr = np.array([1, 2, 3])
- result = check_array_indexer(arr, indexer)
- expected = np.array([True, False, False], dtype=bool)
- tm.assert_numpy_array_equal(result, expected)
- @pytest.mark.parametrize(
- "indexer",
- [
- [True, False],
- pd.array([True, False], dtype="boolean"),
- np.array([True, False], dtype=np.bool_),
- ],
- )
- def test_bool_raise_length(indexer):
- arr = np.array([1, 2, 3])
- msg = "Boolean index has wrong length"
- with pytest.raises(IndexError, match=msg):
- check_array_indexer(arr, indexer)
- @pytest.mark.parametrize(
- "indexer", [[0, 1, None], pd.array([0, 1, pd.NA], dtype="Int64")]
- )
- def test_int_raise_missing_values(indexer):
- arr = np.array([1, 2, 3])
- msg = "Cannot index with an integer indexer containing NA values"
- with pytest.raises(ValueError, match=msg):
- check_array_indexer(arr, indexer)
- @pytest.mark.parametrize(
- "indexer",
- [
- [0.0, 1.0],
- np.array([1.0, 2.0], dtype="float64"),
- np.array([True, False], dtype=object),
- pd.Index([True, False], dtype=object),
- ],
- )
- def test_raise_invalid_array_dtypes(indexer):
- arr = np.array([1, 2, 3])
- msg = "arrays used as indices must be of integer or boolean type"
- with pytest.raises(IndexError, match=msg):
- check_array_indexer(arr, indexer)
- def test_raise_nullable_string_dtype(nullable_string_dtype):
- indexer = pd.array(["a", "b"], dtype=nullable_string_dtype)
- arr = np.array([1, 2, 3])
- msg = "arrays used as indices must be of integer or boolean type"
- with pytest.raises(IndexError, match=msg):
- check_array_indexer(arr, indexer)
- @pytest.mark.parametrize("indexer", [None, Ellipsis, slice(0, 3), (None,)])
- def test_pass_through_non_array_likes(indexer):
- arr = np.array([1, 2, 3])
- result = check_array_indexer(arr, indexer)
- assert result == indexer
|