test_rename.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. from datetime import datetime
  2. import re
  3. import numpy as np
  4. import pytest
  5. from pandas import (
  6. Index,
  7. MultiIndex,
  8. Series,
  9. )
  10. import pandas._testing as tm
  11. class TestRename:
  12. def test_rename(self, datetime_series):
  13. ts = datetime_series
  14. renamer = lambda x: x.strftime("%Y%m%d")
  15. renamed = ts.rename(renamer)
  16. assert renamed.index[0] == renamer(ts.index[0])
  17. # dict
  18. rename_dict = dict(zip(ts.index, renamed.index))
  19. renamed2 = ts.rename(rename_dict)
  20. tm.assert_series_equal(renamed, renamed2)
  21. def test_rename_partial_dict(self):
  22. # partial dict
  23. ser = Series(np.arange(4), index=["a", "b", "c", "d"], dtype="int64")
  24. renamed = ser.rename({"b": "foo", "d": "bar"})
  25. tm.assert_index_equal(renamed.index, Index(["a", "foo", "c", "bar"]))
  26. def test_rename_retain_index_name(self):
  27. # index with name
  28. renamer = Series(
  29. np.arange(4), index=Index(["a", "b", "c", "d"], name="name"), dtype="int64"
  30. )
  31. renamed = renamer.rename({})
  32. assert renamed.index.name == renamer.index.name
  33. def test_rename_by_series(self):
  34. ser = Series(range(5), name="foo")
  35. renamer = Series({1: 10, 2: 20})
  36. result = ser.rename(renamer)
  37. expected = Series(range(5), index=[0, 10, 20, 3, 4], name="foo")
  38. tm.assert_series_equal(result, expected)
  39. def test_rename_set_name(self):
  40. ser = Series(range(4), index=list("abcd"))
  41. for name in ["foo", 123, 123.0, datetime(2001, 11, 11), ("foo",)]:
  42. result = ser.rename(name)
  43. assert result.name == name
  44. tm.assert_numpy_array_equal(result.index.values, ser.index.values)
  45. assert ser.name is None
  46. def test_rename_set_name_inplace(self):
  47. ser = Series(range(3), index=list("abc"))
  48. for name in ["foo", 123, 123.0, datetime(2001, 11, 11), ("foo",)]:
  49. ser.rename(name, inplace=True)
  50. assert ser.name == name
  51. exp = np.array(["a", "b", "c"], dtype=np.object_)
  52. tm.assert_numpy_array_equal(ser.index.values, exp)
  53. def test_rename_axis_supported(self):
  54. # Supporting axis for compatibility, detailed in GH-18589
  55. ser = Series(range(5))
  56. ser.rename({}, axis=0)
  57. ser.rename({}, axis="index")
  58. with pytest.raises(ValueError, match="No axis named 5"):
  59. ser.rename({}, axis=5)
  60. def test_rename_inplace(self, datetime_series):
  61. renamer = lambda x: x.strftime("%Y%m%d")
  62. expected = renamer(datetime_series.index[0])
  63. datetime_series.rename(renamer, inplace=True)
  64. assert datetime_series.index[0] == expected
  65. def test_rename_with_custom_indexer(self):
  66. # GH 27814
  67. class MyIndexer:
  68. pass
  69. ix = MyIndexer()
  70. ser = Series([1, 2, 3]).rename(ix)
  71. assert ser.name is ix
  72. def test_rename_with_custom_indexer_inplace(self):
  73. # GH 27814
  74. class MyIndexer:
  75. pass
  76. ix = MyIndexer()
  77. ser = Series([1, 2, 3])
  78. ser.rename(ix, inplace=True)
  79. assert ser.name is ix
  80. def test_rename_callable(self):
  81. # GH 17407
  82. ser = Series(range(1, 6), index=Index(range(2, 7), name="IntIndex"))
  83. result = ser.rename(str)
  84. expected = ser.rename(lambda i: str(i))
  85. tm.assert_series_equal(result, expected)
  86. assert result.name == expected.name
  87. def test_rename_none(self):
  88. # GH 40977
  89. ser = Series([1, 2], name="foo")
  90. result = ser.rename(None)
  91. expected = Series([1, 2])
  92. tm.assert_series_equal(result, expected)
  93. def test_rename_series_with_multiindex(self):
  94. # issue #43659
  95. arrays = [
  96. ["bar", "baz", "baz", "foo", "qux"],
  97. ["one", "one", "two", "two", "one"],
  98. ]
  99. index = MultiIndex.from_arrays(arrays, names=["first", "second"])
  100. ser = Series(np.ones(5), index=index)
  101. result = ser.rename(index={"one": "yes"}, level="second", errors="raise")
  102. arrays_expected = [
  103. ["bar", "baz", "baz", "foo", "qux"],
  104. ["yes", "yes", "two", "two", "yes"],
  105. ]
  106. index_expected = MultiIndex.from_arrays(
  107. arrays_expected, names=["first", "second"]
  108. )
  109. series_expected = Series(np.ones(5), index=index_expected)
  110. tm.assert_series_equal(result, series_expected)
  111. def test_rename_series_with_multiindex_keeps_ea_dtypes(self):
  112. # GH21055
  113. arrays = [
  114. Index([1, 2, 3], dtype="Int64").astype("category"),
  115. Index([1, 2, 3], dtype="Int64"),
  116. ]
  117. mi = MultiIndex.from_arrays(arrays, names=["A", "B"])
  118. ser = Series(1, index=mi)
  119. result = ser.rename({1: 4}, level=1)
  120. arrays_expected = [
  121. Index([1, 2, 3], dtype="Int64").astype("category"),
  122. Index([4, 2, 3], dtype="Int64"),
  123. ]
  124. mi_expected = MultiIndex.from_arrays(arrays_expected, names=["A", "B"])
  125. expected = Series(1, index=mi_expected)
  126. tm.assert_series_equal(result, expected)
  127. def test_rename_error_arg(self):
  128. # GH 46889
  129. ser = Series(["foo", "bar"])
  130. match = re.escape("[2] not found in axis")
  131. with pytest.raises(KeyError, match=match):
  132. ser.rename({2: 9}, errors="raise")
  133. def test_rename_copy_false(self, using_copy_on_write):
  134. # GH 46889
  135. ser = Series(["foo", "bar"])
  136. ser_orig = ser.copy()
  137. shallow_copy = ser.rename({1: 9}, copy=False)
  138. ser[0] = "foobar"
  139. if using_copy_on_write:
  140. assert ser_orig[0] == shallow_copy[0]
  141. assert ser_orig[1] == shallow_copy[9]
  142. else:
  143. assert ser[0] == shallow_copy[0]
  144. assert ser[1] == shallow_copy[9]