test_delitem.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import re
  2. import numpy as np
  3. import pytest
  4. from pandas import (
  5. DataFrame,
  6. MultiIndex,
  7. )
  8. class TestDataFrameDelItem:
  9. def test_delitem(self, float_frame):
  10. del float_frame["A"]
  11. assert "A" not in float_frame
  12. def test_delitem_multiindex(self):
  13. midx = MultiIndex.from_product([["A", "B"], [1, 2]])
  14. df = DataFrame(np.random.randn(4, 4), columns=midx)
  15. assert len(df.columns) == 4
  16. assert ("A",) in df.columns
  17. assert "A" in df.columns
  18. result = df["A"]
  19. assert isinstance(result, DataFrame)
  20. del df["A"]
  21. assert len(df.columns) == 2
  22. # A still in the levels, BUT get a KeyError if trying
  23. # to delete
  24. assert ("A",) not in df.columns
  25. with pytest.raises(KeyError, match=re.escape("('A',)")):
  26. del df[("A",)]
  27. # behavior of dropped/deleted MultiIndex levels changed from
  28. # GH 2770 to GH 19027: MultiIndex no longer '.__contains__'
  29. # levels which are dropped/deleted
  30. assert "A" not in df.columns
  31. with pytest.raises(KeyError, match=re.escape("('A',)")):
  32. del df["A"]
  33. def test_delitem_corner(self, float_frame):
  34. f = float_frame.copy()
  35. del f["D"]
  36. assert len(f.columns) == 3
  37. with pytest.raises(KeyError, match=r"^'D'$"):
  38. del f["D"]
  39. del f["B"]
  40. assert len(f.columns) == 2
  41. def test_delitem_col_still_multiindex(self):
  42. arrays = [["a", "b", "c", "top"], ["", "", "", "OD"], ["", "", "", "wx"]]
  43. tuples = sorted(zip(*arrays))
  44. index = MultiIndex.from_tuples(tuples)
  45. df = DataFrame(np.random.randn(3, 4), columns=index)
  46. del df[("a", "", "")]
  47. assert isinstance(df.columns, MultiIndex)