test_reindex.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # -*- coding: utf-8 -*-
  2. import numpy as np
  3. import pytest
  4. import pandas as pd
  5. from pandas import Index, MultiIndex
  6. import pandas.util.testing as tm
  7. def check_level_names(index, names):
  8. assert [level.name for level in index.levels] == list(names)
  9. def test_reindex(idx):
  10. result, indexer = idx.reindex(list(idx[:4]))
  11. assert isinstance(result, MultiIndex)
  12. check_level_names(result, idx[:4].names)
  13. result, indexer = idx.reindex(list(idx))
  14. assert isinstance(result, MultiIndex)
  15. assert indexer is None
  16. check_level_names(result, idx.names)
  17. def test_reindex_level(idx):
  18. index = Index(['one'])
  19. target, indexer = idx.reindex(index, level='second')
  20. target2, indexer2 = index.reindex(idx, level='second')
  21. exp_index = idx.join(index, level='second', how='right')
  22. exp_index2 = idx.join(index, level='second', how='left')
  23. assert target.equals(exp_index)
  24. exp_indexer = np.array([0, 2, 4])
  25. tm.assert_numpy_array_equal(indexer, exp_indexer, check_dtype=False)
  26. assert target2.equals(exp_index2)
  27. exp_indexer2 = np.array([0, -1, 0, -1, 0, -1])
  28. tm.assert_numpy_array_equal(indexer2, exp_indexer2, check_dtype=False)
  29. with pytest.raises(TypeError, match="Fill method not supported"):
  30. idx.reindex(idx, method='pad', level='second')
  31. with pytest.raises(TypeError, match="Fill method not supported"):
  32. index.reindex(index, method='bfill', level='first')
  33. def test_reindex_preserves_names_when_target_is_list_or_ndarray(idx):
  34. # GH6552
  35. idx = idx.copy()
  36. target = idx.copy()
  37. idx.names = target.names = [None, None]
  38. other_dtype = pd.MultiIndex.from_product([[1, 2], [3, 4]])
  39. # list & ndarray cases
  40. assert idx.reindex([])[0].names == [None, None]
  41. assert idx.reindex(np.array([]))[0].names == [None, None]
  42. assert idx.reindex(target.tolist())[0].names == [None, None]
  43. assert idx.reindex(target.values)[0].names == [None, None]
  44. assert idx.reindex(other_dtype.tolist())[0].names == [None, None]
  45. assert idx.reindex(other_dtype.values)[0].names == [None, None]
  46. idx.names = ['foo', 'bar']
  47. assert idx.reindex([])[0].names == ['foo', 'bar']
  48. assert idx.reindex(np.array([]))[0].names == ['foo', 'bar']
  49. assert idx.reindex(target.tolist())[0].names == ['foo', 'bar']
  50. assert idx.reindex(target.values)[0].names == ['foo', 'bar']
  51. assert idx.reindex(other_dtype.tolist())[0].names == ['foo', 'bar']
  52. assert idx.reindex(other_dtype.values)[0].names == ['foo', 'bar']
  53. def test_reindex_lvl_preserves_names_when_target_is_list_or_array():
  54. # GH7774
  55. idx = pd.MultiIndex.from_product([[0, 1], ['a', 'b']],
  56. names=['foo', 'bar'])
  57. assert idx.reindex([], level=0)[0].names == ['foo', 'bar']
  58. assert idx.reindex([], level=1)[0].names == ['foo', 'bar']
  59. def test_reindex_lvl_preserves_type_if_target_is_empty_list_or_array():
  60. # GH7774
  61. idx = pd.MultiIndex.from_product([[0, 1], ['a', 'b']])
  62. assert idx.reindex([], level=0)[0].levels[0].dtype.type == np.int64
  63. assert idx.reindex([], level=1)[0].levels[1].dtype.type == np.object_
  64. def test_reindex_base(idx):
  65. idx = idx
  66. expected = np.arange(idx.size, dtype=np.intp)
  67. actual = idx.get_indexer(idx)
  68. tm.assert_numpy_array_equal(expected, actual)
  69. with pytest.raises(ValueError, match='Invalid fill method'):
  70. idx.get_indexer(idx, method='invalid')
  71. def test_reindex_non_unique():
  72. idx = pd.MultiIndex.from_tuples([(0, 0), (1, 1), (1, 1), (2, 2)])
  73. a = pd.Series(np.arange(4), index=idx)
  74. new_idx = pd.MultiIndex.from_tuples([(0, 0), (1, 1), (2, 2)])
  75. msg = 'cannot handle a non-unique multi-index!'
  76. with pytest.raises(ValueError, match=msg):
  77. a.reindex(new_idx)