test_reshape.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. from datetime import datetime
  2. import numpy as np
  3. import pytest
  4. import pytz
  5. import pandas as pd
  6. from pandas import (
  7. Index,
  8. MultiIndex,
  9. )
  10. import pandas._testing as tm
  11. def test_insert(idx):
  12. # key contained in all levels
  13. new_index = idx.insert(0, ("bar", "two"))
  14. assert new_index.equal_levels(idx)
  15. assert new_index[0] == ("bar", "two")
  16. # key not contained in all levels
  17. new_index = idx.insert(0, ("abc", "three"))
  18. exp0 = Index(list(idx.levels[0]) + ["abc"], name="first")
  19. tm.assert_index_equal(new_index.levels[0], exp0)
  20. assert new_index.names == ["first", "second"]
  21. exp1 = Index(list(idx.levels[1]) + ["three"], name="second")
  22. tm.assert_index_equal(new_index.levels[1], exp1)
  23. assert new_index[0] == ("abc", "three")
  24. # key wrong length
  25. msg = "Item must have length equal to number of levels"
  26. with pytest.raises(ValueError, match=msg):
  27. idx.insert(0, ("foo2",))
  28. left = pd.DataFrame([["a", "b", 0], ["b", "d", 1]], columns=["1st", "2nd", "3rd"])
  29. left.set_index(["1st", "2nd"], inplace=True)
  30. ts = left["3rd"].copy(deep=True)
  31. left.loc[("b", "x"), "3rd"] = 2
  32. left.loc[("b", "a"), "3rd"] = -1
  33. left.loc[("b", "b"), "3rd"] = 3
  34. left.loc[("a", "x"), "3rd"] = 4
  35. left.loc[("a", "w"), "3rd"] = 5
  36. left.loc[("a", "a"), "3rd"] = 6
  37. ts.loc[("b", "x")] = 2
  38. ts.loc["b", "a"] = -1
  39. ts.loc[("b", "b")] = 3
  40. ts.loc["a", "x"] = 4
  41. ts.loc[("a", "w")] = 5
  42. ts.loc["a", "a"] = 6
  43. right = pd.DataFrame(
  44. [
  45. ["a", "b", 0],
  46. ["b", "d", 1],
  47. ["b", "x", 2],
  48. ["b", "a", -1],
  49. ["b", "b", 3],
  50. ["a", "x", 4],
  51. ["a", "w", 5],
  52. ["a", "a", 6],
  53. ],
  54. columns=["1st", "2nd", "3rd"],
  55. )
  56. right.set_index(["1st", "2nd"], inplace=True)
  57. # FIXME data types changes to float because
  58. # of intermediate nan insertion;
  59. tm.assert_frame_equal(left, right, check_dtype=False)
  60. tm.assert_series_equal(ts, right["3rd"])
  61. def test_insert2():
  62. # GH9250
  63. idx = (
  64. [("test1", i) for i in range(5)]
  65. + [("test2", i) for i in range(6)]
  66. + [("test", 17), ("test", 18)]
  67. )
  68. left = pd.Series(np.linspace(0, 10, 11), MultiIndex.from_tuples(idx[:-2]))
  69. left.loc[("test", 17)] = 11
  70. left.loc[("test", 18)] = 12
  71. right = pd.Series(np.linspace(0, 12, 13), MultiIndex.from_tuples(idx))
  72. tm.assert_series_equal(left, right)
  73. def test_append(idx):
  74. result = idx[:3].append(idx[3:])
  75. assert result.equals(idx)
  76. foos = [idx[:1], idx[1:3], idx[3:]]
  77. result = foos[0].append(foos[1:])
  78. assert result.equals(idx)
  79. # empty
  80. result = idx.append([])
  81. assert result.equals(idx)
  82. def test_append_index():
  83. idx1 = Index([1.1, 1.2, 1.3])
  84. idx2 = pd.date_range("2011-01-01", freq="D", periods=3, tz="Asia/Tokyo")
  85. idx3 = Index(["A", "B", "C"])
  86. midx_lv2 = MultiIndex.from_arrays([idx1, idx2])
  87. midx_lv3 = MultiIndex.from_arrays([idx1, idx2, idx3])
  88. result = idx1.append(midx_lv2)
  89. # see gh-7112
  90. tz = pytz.timezone("Asia/Tokyo")
  91. expected_tuples = [
  92. (1.1, tz.localize(datetime(2011, 1, 1))),
  93. (1.2, tz.localize(datetime(2011, 1, 2))),
  94. (1.3, tz.localize(datetime(2011, 1, 3))),
  95. ]
  96. expected = Index([1.1, 1.2, 1.3] + expected_tuples)
  97. tm.assert_index_equal(result, expected)
  98. result = midx_lv2.append(idx1)
  99. expected = Index(expected_tuples + [1.1, 1.2, 1.3])
  100. tm.assert_index_equal(result, expected)
  101. result = midx_lv2.append(midx_lv2)
  102. expected = MultiIndex.from_arrays([idx1.append(idx1), idx2.append(idx2)])
  103. tm.assert_index_equal(result, expected)
  104. result = midx_lv2.append(midx_lv3)
  105. tm.assert_index_equal(result, expected)
  106. result = midx_lv3.append(midx_lv2)
  107. expected = Index._simple_new(
  108. np.array(
  109. [
  110. (1.1, tz.localize(datetime(2011, 1, 1)), "A"),
  111. (1.2, tz.localize(datetime(2011, 1, 2)), "B"),
  112. (1.3, tz.localize(datetime(2011, 1, 3)), "C"),
  113. ]
  114. + expected_tuples,
  115. dtype=object,
  116. ),
  117. None,
  118. )
  119. tm.assert_index_equal(result, expected)
  120. @pytest.mark.parametrize("name, exp", [("b", "b"), ("c", None)])
  121. def test_append_names_match(name, exp):
  122. # GH#48288
  123. midx = MultiIndex.from_arrays([[1, 2], [3, 4]], names=["a", "b"])
  124. midx2 = MultiIndex.from_arrays([[3], [5]], names=["a", name])
  125. result = midx.append(midx2)
  126. expected = MultiIndex.from_arrays([[1, 2, 3], [3, 4, 5]], names=["a", exp])
  127. tm.assert_index_equal(result, expected)
  128. def test_append_names_dont_match():
  129. # GH#48288
  130. midx = MultiIndex.from_arrays([[1, 2], [3, 4]], names=["a", "b"])
  131. midx2 = MultiIndex.from_arrays([[3], [5]], names=["x", "y"])
  132. result = midx.append(midx2)
  133. expected = MultiIndex.from_arrays([[1, 2, 3], [3, 4, 5]], names=None)
  134. tm.assert_index_equal(result, expected)
  135. def test_repeat():
  136. reps = 2
  137. numbers = [1, 2, 3]
  138. names = np.array(["foo", "bar"])
  139. m = MultiIndex.from_product([numbers, names], names=names)
  140. expected = MultiIndex.from_product([numbers, names.repeat(reps)], names=names)
  141. tm.assert_index_equal(m.repeat(reps), expected)
  142. def test_insert_base(idx):
  143. result = idx[1:4]
  144. # test 0th element
  145. assert idx[0:4].equals(result.insert(0, idx[0]))
  146. def test_delete_base(idx):
  147. expected = idx[1:]
  148. result = idx.delete(0)
  149. assert result.equals(expected)
  150. assert result.name == expected.name
  151. expected = idx[:-1]
  152. result = idx.delete(-1)
  153. assert result.equals(expected)
  154. assert result.name == expected.name
  155. msg = "index 6 is out of bounds for axis 0 with size 6"
  156. with pytest.raises(IndexError, match=msg):
  157. idx.delete(len(idx))