test_take.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import pytest
  2. import pandas._testing as tm
  3. class TestDataFrameTake:
  4. def test_take(self, float_frame):
  5. # homogeneous
  6. order = [3, 1, 2, 0]
  7. for df in [float_frame]:
  8. result = df.take(order, axis=0)
  9. expected = df.reindex(df.index.take(order))
  10. tm.assert_frame_equal(result, expected)
  11. # axis = 1
  12. result = df.take(order, axis=1)
  13. expected = df.loc[:, ["D", "B", "C", "A"]]
  14. tm.assert_frame_equal(result, expected, check_names=False)
  15. # negative indices
  16. order = [2, 1, -1]
  17. for df in [float_frame]:
  18. result = df.take(order, axis=0)
  19. expected = df.reindex(df.index.take(order))
  20. tm.assert_frame_equal(result, expected)
  21. result = df.take(order, axis=0)
  22. tm.assert_frame_equal(result, expected)
  23. # axis = 1
  24. result = df.take(order, axis=1)
  25. expected = df.loc[:, ["C", "B", "D"]]
  26. tm.assert_frame_equal(result, expected, check_names=False)
  27. # illegal indices
  28. msg = "indices are out-of-bounds"
  29. with pytest.raises(IndexError, match=msg):
  30. df.take([3, 1, 2, 30], axis=0)
  31. with pytest.raises(IndexError, match=msg):
  32. df.take([3, 1, 2, -31], axis=0)
  33. with pytest.raises(IndexError, match=msg):
  34. df.take([3, 1, 2, 5], axis=1)
  35. with pytest.raises(IndexError, match=msg):
  36. df.take([3, 1, 2, -5], axis=1)
  37. def test_take_mixed_type(self, float_string_frame):
  38. # mixed-dtype
  39. order = [4, 1, 2, 0, 3]
  40. for df in [float_string_frame]:
  41. result = df.take(order, axis=0)
  42. expected = df.reindex(df.index.take(order))
  43. tm.assert_frame_equal(result, expected)
  44. # axis = 1
  45. result = df.take(order, axis=1)
  46. expected = df.loc[:, ["foo", "B", "C", "A", "D"]]
  47. tm.assert_frame_equal(result, expected)
  48. # negative indices
  49. order = [4, 1, -2]
  50. for df in [float_string_frame]:
  51. result = df.take(order, axis=0)
  52. expected = df.reindex(df.index.take(order))
  53. tm.assert_frame_equal(result, expected)
  54. # axis = 1
  55. result = df.take(order, axis=1)
  56. expected = df.loc[:, ["foo", "B", "D"]]
  57. tm.assert_frame_equal(result, expected)
  58. def test_take_mixed_numeric(self, mixed_float_frame, mixed_int_frame):
  59. # by dtype
  60. order = [1, 2, 0, 3]
  61. for df in [mixed_float_frame, mixed_int_frame]:
  62. result = df.take(order, axis=0)
  63. expected = df.reindex(df.index.take(order))
  64. tm.assert_frame_equal(result, expected)
  65. # axis = 1
  66. result = df.take(order, axis=1)
  67. expected = df.loc[:, ["B", "C", "A", "D"]]
  68. tm.assert_frame_equal(result, expected)