test_reshape.py 3.4 KB

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