test_partial.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. from warnings import catch_warnings, simplefilter
  2. import numpy as np
  3. import pytest
  4. from pandas import DataFrame, MultiIndex
  5. from pandas.util import testing as tm
  6. class TestMultiIndexPartial(object):
  7. def test_getitem_partial_int(self):
  8. # GH 12416
  9. # with single item
  10. l1 = [10, 20]
  11. l2 = ['a', 'b']
  12. df = DataFrame(index=range(2),
  13. columns=MultiIndex.from_product([l1, l2]))
  14. expected = DataFrame(index=range(2),
  15. columns=l2)
  16. result = df[20]
  17. tm.assert_frame_equal(result, expected)
  18. # with list
  19. expected = DataFrame(index=range(2),
  20. columns=MultiIndex.from_product([l1[1:], l2]))
  21. result = df[[20]]
  22. tm.assert_frame_equal(result, expected)
  23. # missing item:
  24. with pytest.raises(KeyError, match='1'):
  25. df[1]
  26. with pytest.raises(KeyError, match=r"'\[1\] not in index'"):
  27. df[[1]]
  28. def test_series_slice_partial(self):
  29. pass
  30. def test_xs_partial(self, multiindex_dataframe_random_data,
  31. multiindex_year_month_day_dataframe_random_data):
  32. frame = multiindex_dataframe_random_data
  33. ymd = multiindex_year_month_day_dataframe_random_data
  34. result = frame.xs('foo')
  35. result2 = frame.loc['foo']
  36. expected = frame.T['foo'].T
  37. tm.assert_frame_equal(result, expected)
  38. tm.assert_frame_equal(result, result2)
  39. result = ymd.xs((2000, 4))
  40. expected = ymd.loc[2000, 4]
  41. tm.assert_frame_equal(result, expected)
  42. # ex from #1796
  43. index = MultiIndex(levels=[['foo', 'bar'], ['one', 'two'], [-1, 1]],
  44. codes=[[0, 0, 0, 0, 1, 1, 1, 1],
  45. [0, 0, 1, 1, 0, 0, 1, 1], [0, 1, 0, 1, 0, 1,
  46. 0, 1]])
  47. df = DataFrame(np.random.randn(8, 4), index=index,
  48. columns=list('abcd'))
  49. result = df.xs(['foo', 'one'])
  50. expected = df.loc['foo', 'one']
  51. tm.assert_frame_equal(result, expected)
  52. def test_getitem_partial(
  53. self, multiindex_year_month_day_dataframe_random_data):
  54. ymd = multiindex_year_month_day_dataframe_random_data
  55. ymd = ymd.T
  56. result = ymd[2000, 2]
  57. expected = ymd.reindex(columns=ymd.columns[ymd.columns.codes[1] == 1])
  58. expected.columns = expected.columns.droplevel(0).droplevel(0)
  59. tm.assert_frame_equal(result, expected)
  60. def test_fancy_slice_partial(
  61. self, multiindex_dataframe_random_data,
  62. multiindex_year_month_day_dataframe_random_data):
  63. frame = multiindex_dataframe_random_data
  64. result = frame.loc['bar':'baz']
  65. expected = frame[3:7]
  66. tm.assert_frame_equal(result, expected)
  67. ymd = multiindex_year_month_day_dataframe_random_data
  68. result = ymd.loc[(2000, 2):(2000, 4)]
  69. lev = ymd.index.codes[1]
  70. expected = ymd[(lev >= 1) & (lev <= 3)]
  71. tm.assert_frame_equal(result, expected)
  72. def test_getitem_partial_column_select(self):
  73. idx = MultiIndex(codes=[[0, 0, 0], [0, 1, 1], [1, 0, 1]],
  74. levels=[['a', 'b'], ['x', 'y'], ['p', 'q']])
  75. df = DataFrame(np.random.rand(3, 2), index=idx)
  76. result = df.loc[('a', 'y'), :]
  77. expected = df.loc[('a', 'y')]
  78. tm.assert_frame_equal(result, expected)
  79. result = df.loc[('a', 'y'), [1, 0]]
  80. expected = df.loc[('a', 'y')][[1, 0]]
  81. tm.assert_frame_equal(result, expected)
  82. with catch_warnings(record=True):
  83. simplefilter("ignore", DeprecationWarning)
  84. result = df.ix[('a', 'y'), [1, 0]]
  85. tm.assert_frame_equal(result, expected)
  86. pytest.raises(KeyError, df.loc.__getitem__,
  87. (('a', 'foo'), slice(None, None)))
  88. def test_partial_set(
  89. self, multiindex_year_month_day_dataframe_random_data):
  90. # GH #397
  91. ymd = multiindex_year_month_day_dataframe_random_data
  92. df = ymd.copy()
  93. exp = ymd.copy()
  94. df.loc[2000, 4] = 0
  95. exp.loc[2000, 4].values[:] = 0
  96. tm.assert_frame_equal(df, exp)
  97. df['A'].loc[2000, 4] = 1
  98. exp['A'].loc[2000, 4].values[:] = 1
  99. tm.assert_frame_equal(df, exp)
  100. df.loc[2000] = 5
  101. exp.loc[2000].values[:] = 5
  102. tm.assert_frame_equal(df, exp)
  103. # this works...for now
  104. df['A'].iloc[14] = 5
  105. assert df['A'][14] == 5
  106. # ---------------------------------------------------------------------
  107. # AMBIGUOUS CASES!
  108. def test_partial_ix_missing(
  109. self, multiindex_year_month_day_dataframe_random_data):
  110. pytest.skip("skipping for now")
  111. ymd = multiindex_year_month_day_dataframe_random_data
  112. result = ymd.loc[2000, 0]
  113. expected = ymd.loc[2000]['A']
  114. tm.assert_series_equal(result, expected)
  115. # need to put in some work here
  116. # self.ymd.loc[2000, 0] = 0
  117. # assert (self.ymd.loc[2000]['A'] == 0).all()
  118. # Pretty sure the second (and maybe even the first) is already wrong.
  119. pytest.raises(Exception, ymd.loc.__getitem__, (2000, 6))
  120. pytest.raises(Exception, ymd.loc.__getitem__, (2000, 6), 0)
  121. # ---------------------------------------------------------------------
  122. def test_setitem_multiple_partial(self, multiindex_dataframe_random_data):
  123. frame = multiindex_dataframe_random_data
  124. expected = frame.copy()
  125. result = frame.copy()
  126. result.loc[['foo', 'bar']] = 0
  127. expected.loc['foo'] = 0
  128. expected.loc['bar'] = 0
  129. tm.assert_frame_equal(result, expected)
  130. expected = frame.copy()
  131. result = frame.copy()
  132. result.loc['foo':'bar'] = 0
  133. expected.loc['foo'] = 0
  134. expected.loc['bar'] = 0
  135. tm.assert_frame_equal(result, expected)
  136. expected = frame['A'].copy()
  137. result = frame['A'].copy()
  138. result.loc[['foo', 'bar']] = 0
  139. expected.loc['foo'] = 0
  140. expected.loc['bar'] = 0
  141. tm.assert_series_equal(result, expected)
  142. expected = frame['A'].copy()
  143. result = frame['A'].copy()
  144. result.loc['foo':'bar'] = 0
  145. expected.loc['foo'] = 0
  146. expected.loc['bar'] = 0
  147. tm.assert_series_equal(result, expected)