test_reshape.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import numpy as np
  2. import pytest
  3. import pandas as pd
  4. from pandas import Index, MultiIndex
  5. import pandas._testing as tm
  6. def test_insert(idx):
  7. # key contained in all levels
  8. new_index = idx.insert(0, ("bar", "two"))
  9. assert new_index.equal_levels(idx)
  10. assert new_index[0] == ("bar", "two")
  11. # key not contained in all levels
  12. new_index = idx.insert(0, ("abc", "three"))
  13. exp0 = Index(list(idx.levels[0]) + ["abc"], name="first")
  14. tm.assert_index_equal(new_index.levels[0], exp0)
  15. assert new_index.names == ["first", "second"]
  16. exp1 = Index(list(idx.levels[1]) + ["three"], name="second")
  17. tm.assert_index_equal(new_index.levels[1], exp1)
  18. assert new_index[0] == ("abc", "three")
  19. # key wrong length
  20. msg = "Item must have length equal to number of levels"
  21. with pytest.raises(ValueError, match=msg):
  22. idx.insert(0, ("foo2",))
  23. left = pd.DataFrame([["a", "b", 0], ["b", "d", 1]], columns=["1st", "2nd", "3rd"])
  24. left.set_index(["1st", "2nd"], inplace=True)
  25. ts = left["3rd"].copy(deep=True)
  26. left.loc[("b", "x"), "3rd"] = 2
  27. left.loc[("b", "a"), "3rd"] = -1
  28. left.loc[("b", "b"), "3rd"] = 3
  29. left.loc[("a", "x"), "3rd"] = 4
  30. left.loc[("a", "w"), "3rd"] = 5
  31. left.loc[("a", "a"), "3rd"] = 6
  32. ts.loc[("b", "x")] = 2
  33. ts.loc["b", "a"] = -1
  34. ts.loc[("b", "b")] = 3
  35. ts.loc["a", "x"] = 4
  36. ts.loc[("a", "w")] = 5
  37. ts.loc["a", "a"] = 6
  38. right = pd.DataFrame(
  39. [
  40. ["a", "b", 0],
  41. ["b", "d", 1],
  42. ["b", "x", 2],
  43. ["b", "a", -1],
  44. ["b", "b", 3],
  45. ["a", "x", 4],
  46. ["a", "w", 5],
  47. ["a", "a", 6],
  48. ],
  49. columns=["1st", "2nd", "3rd"],
  50. )
  51. right.set_index(["1st", "2nd"], inplace=True)
  52. # FIXME data types changes to float because
  53. # of intermediate nan insertion;
  54. tm.assert_frame_equal(left, right, check_dtype=False)
  55. tm.assert_series_equal(ts, right["3rd"])
  56. # GH9250
  57. idx = (
  58. [("test1", i) for i in range(5)]
  59. + [("test2", i) for i in range(6)]
  60. + [("test", 17), ("test", 18)]
  61. )
  62. left = pd.Series(np.linspace(0, 10, 11), pd.MultiIndex.from_tuples(idx[:-2]))
  63. left.loc[("test", 17)] = 11
  64. left.loc[("test", 18)] = 12
  65. right = pd.Series(np.linspace(0, 12, 13), pd.MultiIndex.from_tuples(idx))
  66. tm.assert_series_equal(left, right)
  67. def test_append(idx):
  68. result = idx[:3].append(idx[3:])
  69. assert result.equals(idx)
  70. foos = [idx[:1], idx[1:3], idx[3:]]
  71. result = foos[0].append(foos[1:])
  72. assert result.equals(idx)
  73. # empty
  74. result = idx.append([])
  75. assert result.equals(idx)
  76. def test_repeat():
  77. reps = 2
  78. numbers = [1, 2, 3]
  79. names = np.array(["foo", "bar"])
  80. m = MultiIndex.from_product([numbers, names], names=names)
  81. expected = MultiIndex.from_product([numbers, names.repeat(reps)], names=names)
  82. tm.assert_index_equal(m.repeat(reps), expected)
  83. def test_insert_base(idx):
  84. result = idx[1:4]
  85. # test 0th element
  86. assert idx[0:4].equals(result.insert(0, idx[0]))
  87. def test_delete_base(idx):
  88. expected = idx[1:]
  89. result = idx.delete(0)
  90. assert result.equals(expected)
  91. assert result.name == expected.name
  92. expected = idx[:-1]
  93. result = idx.delete(-1)
  94. assert result.equals(expected)
  95. assert result.name == expected.name
  96. with pytest.raises((IndexError, ValueError)):
  97. # Exception raised depends on NumPy version.
  98. idx.delete(len(idx))