test_first_valid_index.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. """
  2. Includes test for last_valid_index.
  3. """
  4. import numpy as np
  5. import pytest
  6. from pandas import (
  7. DataFrame,
  8. Series,
  9. )
  10. import pandas._testing as tm
  11. class TestFirstValidIndex:
  12. def test_first_valid_index_single_nan(self, frame_or_series):
  13. # GH#9752 Series/DataFrame should both return None, not raise
  14. obj = frame_or_series([np.nan])
  15. assert obj.first_valid_index() is None
  16. assert obj.iloc[:0].first_valid_index() is None
  17. @pytest.mark.parametrize(
  18. "empty", [DataFrame(), Series(dtype=object), Series([], index=[], dtype=object)]
  19. )
  20. def test_first_valid_index_empty(self, empty):
  21. # GH#12800
  22. assert empty.last_valid_index() is None
  23. assert empty.first_valid_index() is None
  24. @pytest.mark.parametrize(
  25. "data,idx,expected_first,expected_last",
  26. [
  27. ({"A": [1, 2, 3]}, [1, 1, 2], 1, 2),
  28. ({"A": [1, 2, 3]}, [1, 2, 2], 1, 2),
  29. ({"A": [1, 2, 3, 4]}, ["d", "d", "d", "d"], "d", "d"),
  30. ({"A": [1, np.nan, 3]}, [1, 1, 2], 1, 2),
  31. ({"A": [np.nan, np.nan, 3]}, [1, 1, 2], 2, 2),
  32. ({"A": [1, np.nan, 3]}, [1, 2, 2], 1, 2),
  33. ],
  34. )
  35. def test_first_last_valid_frame(self, data, idx, expected_first, expected_last):
  36. # GH#21441
  37. df = DataFrame(data, index=idx)
  38. assert expected_first == df.first_valid_index()
  39. assert expected_last == df.last_valid_index()
  40. @pytest.mark.parametrize("index_func", [tm.makeStringIndex, tm.makeDateIndex])
  41. def test_first_last_valid(self, index_func):
  42. N = 30
  43. index = index_func(N)
  44. mat = np.random.randn(N)
  45. mat[:5] = np.nan
  46. mat[-5:] = np.nan
  47. frame = DataFrame({"foo": mat}, index=index)
  48. assert frame.first_valid_index() == frame.index[5]
  49. assert frame.last_valid_index() == frame.index[-6]
  50. ser = frame["foo"]
  51. assert ser.first_valid_index() == frame.index[5]
  52. assert ser.last_valid_index() == frame.index[-6]
  53. @pytest.mark.parametrize("index_func", [tm.makeStringIndex, tm.makeDateIndex])
  54. def test_first_last_valid_all_nan(self, index_func):
  55. # GH#17400: no valid entries
  56. index = index_func(30)
  57. frame = DataFrame(np.nan, columns=["foo"], index=index)
  58. assert frame.last_valid_index() is None
  59. assert frame.first_valid_index() is None
  60. ser = frame["foo"]
  61. assert ser.first_valid_index() is None
  62. assert ser.last_valid_index() is None