test_alter_axes.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. # coding=utf-8
  2. # pylint: disable-msg=E1101,W0612
  3. from datetime import datetime
  4. import numpy as np
  5. import pytest
  6. from pandas.compat import lrange, range, zip
  7. from pandas import DataFrame, Index, MultiIndex, RangeIndex, Series
  8. import pandas.util.testing as tm
  9. class TestSeriesAlterAxes(object):
  10. def test_setindex(self, string_series):
  11. # wrong type
  12. msg = (r"Index\(\.\.\.\) must be called with a collection of some"
  13. r" kind, None was passed")
  14. with pytest.raises(TypeError, match=msg):
  15. string_series.index = None
  16. # wrong length
  17. msg = ("Length mismatch: Expected axis has 30 elements, new"
  18. " values have 29 elements")
  19. with pytest.raises(ValueError, match=msg):
  20. string_series.index = np.arange(len(string_series) - 1)
  21. # works
  22. string_series.index = np.arange(len(string_series))
  23. assert isinstance(string_series.index, Index)
  24. # Renaming
  25. def test_rename(self, datetime_series):
  26. ts = datetime_series
  27. renamer = lambda x: x.strftime('%Y%m%d')
  28. renamed = ts.rename(renamer)
  29. assert renamed.index[0] == renamer(ts.index[0])
  30. # dict
  31. rename_dict = dict(zip(ts.index, renamed.index))
  32. renamed2 = ts.rename(rename_dict)
  33. tm.assert_series_equal(renamed, renamed2)
  34. # partial dict
  35. s = Series(np.arange(4), index=['a', 'b', 'c', 'd'], dtype='int64')
  36. renamed = s.rename({'b': 'foo', 'd': 'bar'})
  37. tm.assert_index_equal(renamed.index, Index(['a', 'foo', 'c', 'bar']))
  38. # index with name
  39. renamer = Series(np.arange(4),
  40. index=Index(['a', 'b', 'c', 'd'], name='name'),
  41. dtype='int64')
  42. renamed = renamer.rename({})
  43. assert renamed.index.name == renamer.index.name
  44. def test_rename_by_series(self):
  45. s = Series(range(5), name='foo')
  46. renamer = Series({1: 10, 2: 20})
  47. result = s.rename(renamer)
  48. expected = Series(range(5), index=[0, 10, 20, 3, 4], name='foo')
  49. tm.assert_series_equal(result, expected)
  50. def test_rename_set_name(self):
  51. s = Series(range(4), index=list('abcd'))
  52. for name in ['foo', 123, 123., datetime(2001, 11, 11), ('foo',)]:
  53. result = s.rename(name)
  54. assert result.name == name
  55. tm.assert_numpy_array_equal(result.index.values, s.index.values)
  56. assert s.name is None
  57. def test_rename_set_name_inplace(self):
  58. s = Series(range(3), index=list('abc'))
  59. for name in ['foo', 123, 123., datetime(2001, 11, 11), ('foo',)]:
  60. s.rename(name, inplace=True)
  61. assert s.name == name
  62. exp = np.array(['a', 'b', 'c'], dtype=np.object_)
  63. tm.assert_numpy_array_equal(s.index.values, exp)
  64. def test_rename_axis_supported(self):
  65. # Supporting axis for compatibility, detailed in GH-18589
  66. s = Series(range(5))
  67. s.rename({}, axis=0)
  68. s.rename({}, axis='index')
  69. with pytest.raises(ValueError, match='No axis named 5'):
  70. s.rename({}, axis=5)
  71. def test_set_name_attribute(self):
  72. s = Series([1, 2, 3])
  73. s2 = Series([1, 2, 3], name='bar')
  74. for name in [7, 7., 'name', datetime(2001, 1, 1), (1,), u"\u05D0"]:
  75. s.name = name
  76. assert s.name == name
  77. s2.name = name
  78. assert s2.name == name
  79. def test_set_name(self):
  80. s = Series([1, 2, 3])
  81. s2 = s._set_name('foo')
  82. assert s2.name == 'foo'
  83. assert s.name is None
  84. assert s is not s2
  85. def test_rename_inplace(self, datetime_series):
  86. renamer = lambda x: x.strftime('%Y%m%d')
  87. expected = renamer(datetime_series.index[0])
  88. datetime_series.rename(renamer, inplace=True)
  89. assert datetime_series.index[0] == expected
  90. def test_set_index_makes_timeseries(self):
  91. idx = tm.makeDateIndex(10)
  92. s = Series(lrange(10))
  93. s.index = idx
  94. assert s.index.is_all_dates
  95. def test_reset_index(self):
  96. df = tm.makeDataFrame()[:5]
  97. ser = df.stack()
  98. ser.index.names = ['hash', 'category']
  99. ser.name = 'value'
  100. df = ser.reset_index()
  101. assert 'value' in df
  102. df = ser.reset_index(name='value2')
  103. assert 'value2' in df
  104. # check inplace
  105. s = ser.reset_index(drop=True)
  106. s2 = ser
  107. s2.reset_index(drop=True, inplace=True)
  108. tm.assert_series_equal(s, s2)
  109. # level
  110. index = MultiIndex(levels=[['bar'], ['one', 'two', 'three'], [0, 1]],
  111. codes=[[0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 1, 2],
  112. [0, 1, 0, 1, 0, 1]])
  113. s = Series(np.random.randn(6), index=index)
  114. rs = s.reset_index(level=1)
  115. assert len(rs.columns) == 2
  116. rs = s.reset_index(level=[0, 2], drop=True)
  117. tm.assert_index_equal(rs.index, Index(index.get_level_values(1)))
  118. assert isinstance(rs, Series)
  119. def test_reset_index_name(self):
  120. s = Series([1, 2, 3], index=Index(range(3), name='x'))
  121. assert s.reset_index().index.name is None
  122. assert s.reset_index(drop=True).index.name is None
  123. def test_reset_index_level(self):
  124. df = DataFrame([[1, 2, 3], [4, 5, 6]],
  125. columns=['A', 'B', 'C'])
  126. for levels in ['A', 'B'], [0, 1]:
  127. # With MultiIndex
  128. s = df.set_index(['A', 'B'])['C']
  129. result = s.reset_index(level=levels[0])
  130. tm.assert_frame_equal(result, df.set_index('B'))
  131. result = s.reset_index(level=levels[:1])
  132. tm.assert_frame_equal(result, df.set_index('B'))
  133. result = s.reset_index(level=levels)
  134. tm.assert_frame_equal(result, df)
  135. result = df.set_index(['A', 'B']).reset_index(level=levels,
  136. drop=True)
  137. tm.assert_frame_equal(result, df[['C']])
  138. with pytest.raises(KeyError, match='Level E '):
  139. s.reset_index(level=['A', 'E'])
  140. # With single-level Index
  141. s = df.set_index('A')['B']
  142. result = s.reset_index(level=levels[0])
  143. tm.assert_frame_equal(result, df[['A', 'B']])
  144. result = s.reset_index(level=levels[:1])
  145. tm.assert_frame_equal(result, df[['A', 'B']])
  146. result = s.reset_index(level=levels[0], drop=True)
  147. tm.assert_series_equal(result, df['B'])
  148. with pytest.raises(IndexError, match='Too many levels'):
  149. s.reset_index(level=[0, 1, 2])
  150. # Check that .reset_index([],drop=True) doesn't fail
  151. result = Series(range(4)).reset_index([], drop=True)
  152. expected = Series(range(4))
  153. tm.assert_series_equal(result, expected)
  154. def test_reset_index_range(self):
  155. # GH 12071
  156. s = Series(range(2), name='A', dtype='int64')
  157. series_result = s.reset_index()
  158. assert isinstance(series_result.index, RangeIndex)
  159. series_expected = DataFrame([[0, 0], [1, 1]],
  160. columns=['index', 'A'],
  161. index=RangeIndex(stop=2))
  162. tm.assert_frame_equal(series_result, series_expected)
  163. def test_reorder_levels(self):
  164. index = MultiIndex(levels=[['bar'], ['one', 'two', 'three'], [0, 1]],
  165. codes=[[0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 1, 2],
  166. [0, 1, 0, 1, 0, 1]],
  167. names=['L0', 'L1', 'L2'])
  168. s = Series(np.arange(6), index=index)
  169. # no change, position
  170. result = s.reorder_levels([0, 1, 2])
  171. tm.assert_series_equal(s, result)
  172. # no change, labels
  173. result = s.reorder_levels(['L0', 'L1', 'L2'])
  174. tm.assert_series_equal(s, result)
  175. # rotate, position
  176. result = s.reorder_levels([1, 2, 0])
  177. e_idx = MultiIndex(levels=[['one', 'two', 'three'], [0, 1], ['bar']],
  178. codes=[[0, 1, 2, 0, 1, 2], [0, 1, 0, 1, 0, 1],
  179. [0, 0, 0, 0, 0, 0]],
  180. names=['L1', 'L2', 'L0'])
  181. expected = Series(np.arange(6), index=e_idx)
  182. tm.assert_series_equal(result, expected)
  183. def test_rename_axis_mapper(self):
  184. # GH 19978
  185. mi = MultiIndex.from_product([['a', 'b', 'c'], [1, 2]],
  186. names=['ll', 'nn'])
  187. s = Series([i for i in range(len(mi))], index=mi)
  188. result = s.rename_axis(index={'ll': 'foo'})
  189. assert result.index.names == ['foo', 'nn']
  190. result = s.rename_axis(index=str.upper, axis=0)
  191. assert result.index.names == ['LL', 'NN']
  192. result = s.rename_axis(index=['foo', 'goo'])
  193. assert result.index.names == ['foo', 'goo']
  194. with pytest.raises(TypeError, match='unexpected'):
  195. s.rename_axis(columns='wrong')
  196. def test_rename_axis_inplace(self, datetime_series):
  197. # GH 15704
  198. expected = datetime_series.rename_axis('foo')
  199. result = datetime_series
  200. no_return = result.rename_axis('foo', inplace=True)
  201. assert no_return is None
  202. tm.assert_series_equal(result, expected)
  203. @pytest.mark.parametrize('kwargs', [{'mapper': None}, {'index': None}, {}])
  204. def test_rename_axis_none(self, kwargs):
  205. # GH 25034
  206. index = Index(list('abc'), name='foo')
  207. df = Series([1, 2, 3], index=index)
  208. result = df.rename_axis(**kwargs)
  209. expected_index = index.rename(None) if kwargs else index
  210. expected = Series([1, 2, 3], index=expected_index)
  211. tm.assert_series_equal(result, expected)
  212. def test_set_axis_inplace_axes(self, axis_series):
  213. # GH14636
  214. ser = Series(np.arange(4), index=[1, 3, 5, 7], dtype='int64')
  215. expected = ser.copy()
  216. expected.index = list('abcd')
  217. # inplace=True
  218. # The FutureWarning comes from the fact that we would like to have
  219. # inplace default to False some day
  220. for inplace, warn in [(None, FutureWarning), (True, None)]:
  221. result = ser.copy()
  222. kwargs = {'inplace': inplace}
  223. with tm.assert_produces_warning(warn):
  224. result.set_axis(list('abcd'), axis=axis_series, **kwargs)
  225. tm.assert_series_equal(result, expected)
  226. def test_set_axis_inplace(self):
  227. # GH14636
  228. s = Series(np.arange(4), index=[1, 3, 5, 7], dtype='int64')
  229. expected = s.copy()
  230. expected.index = list('abcd')
  231. # inplace=False
  232. result = s.set_axis(list('abcd'), axis=0, inplace=False)
  233. tm.assert_series_equal(expected, result)
  234. # omitting the "axis" parameter
  235. with tm.assert_produces_warning(None):
  236. result = s.set_axis(list('abcd'), inplace=False)
  237. tm.assert_series_equal(result, expected)
  238. # wrong values for the "axis" parameter
  239. for axis in [2, 'foo']:
  240. with pytest.raises(ValueError, match='No axis named'):
  241. s.set_axis(list('abcd'), axis=axis, inplace=False)
  242. def test_set_axis_prior_to_deprecation_signature(self):
  243. s = Series(np.arange(4), index=[1, 3, 5, 7], dtype='int64')
  244. expected = s.copy()
  245. expected.index = list('abcd')
  246. for axis in [0, 'index']:
  247. with tm.assert_produces_warning(FutureWarning):
  248. result = s.set_axis(0, list('abcd'), inplace=False)
  249. tm.assert_series_equal(result, expected)
  250. def test_reset_index_drop_errors(self):
  251. # GH 20925
  252. # KeyError raised for series index when passed level name is missing
  253. s = Series(range(4))
  254. with pytest.raises(KeyError, match='must be same as name'):
  255. s.reset_index('wrong', drop=True)
  256. with pytest.raises(KeyError, match='must be same as name'):
  257. s.reset_index('wrong')
  258. # KeyError raised for series when level to be dropped is missing
  259. s = Series(range(4), index=MultiIndex.from_product([[1, 2]] * 2))
  260. with pytest.raises(KeyError, match='not found'):
  261. s.reset_index('wrong', drop=True)
  262. def test_droplevel(self):
  263. # GH20342
  264. ser = Series([1, 2, 3, 4])
  265. ser.index = MultiIndex.from_arrays([(1, 2, 3, 4), (5, 6, 7, 8)],
  266. names=['a', 'b'])
  267. expected = ser.reset_index('b', drop=True)
  268. result = ser.droplevel('b', axis='index')
  269. tm.assert_series_equal(result, expected)
  270. # test that droplevel raises ValueError on axis != 0
  271. with pytest.raises(ValueError):
  272. ser.droplevel(1, axis='columns')