test_iloc.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import numpy as np
  2. import pytest
  3. from pandas import DataFrame, MultiIndex, Series
  4. from pandas.util import testing as tm
  5. @pytest.fixture
  6. def simple_multiindex_dataframe():
  7. """
  8. Factory function to create simple 3 x 3 dataframe with
  9. both columns and row MultiIndex using supplied data or
  10. random data by default.
  11. """
  12. def _simple_multiindex_dataframe(data=None):
  13. if data is None:
  14. data = np.random.randn(3, 3)
  15. return DataFrame(data, columns=[[2, 2, 4], [6, 8, 10]],
  16. index=[[4, 4, 8], [8, 10, 12]])
  17. return _simple_multiindex_dataframe
  18. @pytest.mark.parametrize('indexer, expected', [
  19. (lambda df: df.iloc[0],
  20. lambda arr: Series(arr[0], index=[[2, 2, 4], [6, 8, 10]], name=(4, 8))),
  21. (lambda df: df.iloc[2],
  22. lambda arr: Series(arr[2], index=[[2, 2, 4], [6, 8, 10]], name=(8, 12))),
  23. (lambda df: df.iloc[:, 2],
  24. lambda arr: Series(
  25. arr[:, 2], index=[[4, 4, 8], [8, 10, 12]], name=(4, 10)))
  26. ])
  27. def test_iloc_returns_series(indexer, expected, simple_multiindex_dataframe):
  28. arr = np.random.randn(3, 3)
  29. df = simple_multiindex_dataframe(arr)
  30. result = indexer(df)
  31. expected = expected(arr)
  32. tm.assert_series_equal(result, expected)
  33. def test_iloc_returns_dataframe(simple_multiindex_dataframe):
  34. df = simple_multiindex_dataframe()
  35. result = df.iloc[[0, 1]]
  36. expected = df.xs(4, drop_level=False)
  37. tm.assert_frame_equal(result, expected)
  38. def test_iloc_returns_scalar(simple_multiindex_dataframe):
  39. arr = np.random.randn(3, 3)
  40. df = simple_multiindex_dataframe(arr)
  41. result = df.iloc[2, 2]
  42. expected = arr[2, 2]
  43. assert result == expected
  44. def test_iloc_getitem_multiple_items():
  45. # GH 5528
  46. tup = zip(*[['a', 'a', 'b', 'b'], ['x', 'y', 'x', 'y']])
  47. index = MultiIndex.from_tuples(tup)
  48. df = DataFrame(np.random.randn(4, 4), index=index)
  49. result = df.iloc[[2, 3]]
  50. expected = df.xs('b', drop_level=False)
  51. tm.assert_frame_equal(result, expected)
  52. def test_iloc_getitem_labels():
  53. # this is basically regular indexing
  54. arr = np.random.randn(4, 3)
  55. df = DataFrame(arr,
  56. columns=[['i', 'i', 'j'], ['A', 'A', 'B']],
  57. index=[['i', 'i', 'j', 'k'], ['X', 'X', 'Y', 'Y']])
  58. result = df.iloc[2, 2]
  59. expected = arr[2, 2]
  60. assert result == expected
  61. def test_frame_getitem_slice(multiindex_dataframe_random_data):
  62. df = multiindex_dataframe_random_data
  63. result = df.iloc[:4]
  64. expected = df[:4]
  65. tm.assert_frame_equal(result, expected)
  66. def test_frame_setitem_slice(multiindex_dataframe_random_data):
  67. df = multiindex_dataframe_random_data
  68. df.iloc[:4] = 0
  69. assert (df.values[:4] == 0).all()
  70. assert (df.values[4:] != 0).all()
  71. def test_indexing_ambiguity_bug_1678():
  72. # GH 1678
  73. columns = MultiIndex.from_tuples(
  74. [('Ohio', 'Green'), ('Ohio', 'Red'), ('Colorado', 'Green')])
  75. index = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b', 2)])
  76. df = DataFrame(np.arange(12).reshape((4, 3)), index=index, columns=columns)
  77. result = df.iloc[:, 1]
  78. expected = df.loc[:, ('Ohio', 'Red')]
  79. tm.assert_series_equal(result, expected)
  80. def test_iloc_integer_locations():
  81. # GH 13797
  82. data = [['str00', 'str01'], ['str10', 'str11'], ['str20', 'srt21'],
  83. ['str30', 'str31'], ['str40', 'str41']]
  84. index = MultiIndex.from_tuples(
  85. [('CC', 'A'), ('CC', 'B'), ('CC', 'B'), ('BB', 'a'), ('BB', 'b')])
  86. expected = DataFrame(data)
  87. df = DataFrame(data, index=index)
  88. result = DataFrame([[df.iloc[r, c] for c in range(2)] for r in range(5)])
  89. tm.assert_frame_equal(result, expected)
  90. @pytest.mark.parametrize(
  91. 'data, indexes, values, expected_k', [
  92. # test without indexer value in first level of MultiIndex
  93. ([[2, 22, 5], [2, 33, 6]], [0, -1, 1], [2, 3, 1], [7, 10]),
  94. # test like code sample 1 in the issue
  95. ([[1, 22, 555], [1, 33, 666]], [0, -1, 1], [200, 300, 100],
  96. [755, 1066]),
  97. # test like code sample 2 in the issue
  98. ([[1, 3, 7], [2, 4, 8]], [0, -1, 1], [10, 10, 1000], [17, 1018]),
  99. # test like code sample 3 in the issue
  100. ([[1, 11, 4], [2, 22, 5], [3, 33, 6]], [0, -1, 1], [4, 7, 10],
  101. [8, 15, 13])
  102. ])
  103. def test_iloc_setitem_int_multiindex_series(data, indexes, values, expected_k):
  104. # GH17148
  105. df = DataFrame(data=data, columns=['i', 'j', 'k'])
  106. df = df.set_index(['i', 'j'])
  107. series = df.k.copy()
  108. for i, v in zip(indexes, values):
  109. series.iloc[i] += v
  110. df['k'] = expected_k
  111. expected = df.k
  112. tm.assert_series_equal(series, expected)
  113. def test_getitem_iloc(multiindex_dataframe_random_data):
  114. df = multiindex_dataframe_random_data
  115. result = df.iloc[2]
  116. expected = df.xs(df.index[2])
  117. tm.assert_series_equal(result, expected)