test_na_indexing.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import pytest
  2. import pandas as pd
  3. import pandas._testing as tm
  4. @pytest.mark.parametrize(
  5. "values, dtype",
  6. [
  7. ([], "object"),
  8. ([1, 2, 3], "int64"),
  9. ([1.0, 2.0, 3.0], "float64"),
  10. (["a", "b", "c"], "object"),
  11. (["a", "b", "c"], "string"),
  12. ([1, 2, 3], "datetime64[ns]"),
  13. ([1, 2, 3], "datetime64[ns, CET]"),
  14. ([1, 2, 3], "timedelta64[ns]"),
  15. (["2000", "2001", "2002"], "Period[D]"),
  16. ([1, 0, 3], "Sparse"),
  17. ([pd.Interval(0, 1), pd.Interval(1, 2), pd.Interval(3, 4)], "interval"),
  18. ],
  19. )
  20. @pytest.mark.parametrize(
  21. "mask", [[True, False, False], [True, True, True], [False, False, False]]
  22. )
  23. @pytest.mark.parametrize("indexer_class", [list, pd.array, pd.Index, pd.Series])
  24. @pytest.mark.parametrize("frame", [True, False])
  25. def test_series_mask_boolean(values, dtype, mask, indexer_class, frame):
  26. # In case len(values) < 3
  27. index = ["a", "b", "c"][: len(values)]
  28. mask = mask[: len(values)]
  29. obj = pd.Series(values, dtype=dtype, index=index)
  30. if frame:
  31. if len(values) == 0:
  32. # Otherwise obj is an empty DataFrame with shape (0, 1)
  33. obj = pd.DataFrame(dtype=dtype, index=index)
  34. else:
  35. obj = obj.to_frame()
  36. if indexer_class is pd.array:
  37. mask = pd.array(mask, dtype="boolean")
  38. elif indexer_class is pd.Series:
  39. mask = pd.Series(mask, index=obj.index, dtype="boolean")
  40. else:
  41. mask = indexer_class(mask)
  42. expected = obj[mask]
  43. result = obj[mask]
  44. tm.assert_equal(result, expected)
  45. if indexer_class is pd.Series:
  46. msg = "iLocation based boolean indexing cannot use an indexable as a mask"
  47. with pytest.raises(ValueError, match=msg):
  48. result = obj.iloc[mask]
  49. tm.assert_equal(result, expected)
  50. else:
  51. result = obj.iloc[mask]
  52. tm.assert_equal(result, expected)
  53. result = obj.loc[mask]
  54. tm.assert_equal(result, expected)
  55. def test_na_treated_as_false(frame_or_series, indexer_sli):
  56. # https://github.com/pandas-dev/pandas/issues/31503
  57. obj = frame_or_series([1, 2, 3])
  58. mask = pd.array([True, False, None], dtype="boolean")
  59. result = indexer_sli(obj)[mask]
  60. expected = indexer_sli(obj)[mask.fillna(False)]
  61. tm.assert_equal(result, expected)