44from pandas .compat import lrange , range , u , zip
55
66import pandas as pd
7- from pandas import DataFrame , Index , MultiIndex , Series , date_range
7+ from pandas import DataFrame , Index , MultiIndex , Series
88import pandas .core .common as com
9+ from pandas .core .indexing import IndexingError
910from pandas .util import testing as tm
1011
1112
@@ -27,29 +28,6 @@ def test_series_getitem_multiindex(access_method, level1_value, expected):
2728 tm .assert_series_equal (result , expected )
2829
2930
30- def test_series_getitem_multiindex_xs ():
31- # GH6258
32- dt = list (date_range ('20130903' , periods = 3 ))
33- idx = MultiIndex .from_product ([list ('AB' ), dt ])
34- s = Series ([1 , 3 , 4 , 1 , 3 , 4 ], index = idx )
35-
36- result = s .xs ('20130903' , level = 1 )
37- expected = Series ([1 , 1 ], index = list ('AB' ))
38- tm .assert_series_equal (result , expected )
39-
40-
41- def test_series_getitem_multiindex_xs_by_label ():
42- # GH5684
43- idx = MultiIndex .from_tuples ([('a' , 'one' ), ('a' , 'two' ), ('b' , 'one' ),
44- ('b' , 'two' )])
45- s = Series ([1 , 2 , 3 , 4 ], index = idx )
46- s .index .set_names (['L1' , 'L2' ], inplace = True )
47- result = s .xs ('one' , level = 'L2' )
48- expected = Series ([1 , 3 ], index = ['a' , 'b' ])
49- expected .index .set_names (['L1' ], inplace = True )
50- tm .assert_series_equal (result , expected )
51-
52-
5331@pytest .mark .parametrize ('level0_value' , ['D' , 'A' ])
5432def test_getitem_duplicates_multiindex (level0_value ):
5533 # GH 5725 the 'A' happens to be a valid Timestamp so the doesn't raise
@@ -145,63 +123,83 @@ def test_getitem_duplicates_multiindex_non_scalar_type_object():
145123
146124
147125def test_getitem_simple (multiindex_dataframe_random_data ):
148- frame = multiindex_dataframe_random_data
149- df = frame .T
150-
151- col = df ['foo' , 'one' ]
152- tm .assert_almost_equal (col .values , df .values [:, 0 ])
153- msg = r"\('foo', 'four'\)"
154- with pytest .raises (KeyError , match = msg ):
155- df [('foo' , 'four' )]
156- msg = "'foobar'"
157- with pytest .raises (KeyError , match = msg ):
158- df ['foobar' ]
126+ df = multiindex_dataframe_random_data .T
127+ expected = df .values [:, 0 ]
128+ result = df ['foo' , 'one' ].values
129+ tm .assert_almost_equal (result , expected )
159130
160131
161- @pytest .mark .filterwarnings ("ignore:\\ n.ix:DeprecationWarning" )
162- def test_series_getitem (multiindex_year_month_day_dataframe_random_data ):
163- ymd = multiindex_year_month_day_dataframe_random_data
164- s = ymd ['A' ]
165-
166- result = s [2000 , 3 ]
132+ @pytest .mark .parametrize ('indexer,msg' , [
133+ (lambda df : df [('foo' , 'four' )], r"\('foo', 'four'\)" ),
134+ (lambda df : df ['foobar' ], "'foobar'" )
135+ ])
136+ def test_getitem_simple_key_error (
137+ multiindex_dataframe_random_data , indexer , msg ):
138+ df = multiindex_dataframe_random_data .T
139+ with pytest .raises (KeyError , match = msg ):
140+ indexer (df )
167141
168- # TODO(wesm): unused?
169- # result2 = s.loc[2000, 3]
170142
143+ @pytest .mark .parametrize ('indexer' , [
144+ lambda s : s [2000 , 3 ],
145+ lambda s : s .loc [2000 , 3 ]
146+ ])
147+ def test_series_getitem (
148+ multiindex_year_month_day_dataframe_random_data , indexer ):
149+ s = multiindex_year_month_day_dataframe_random_data ['A' ]
171150 expected = s .reindex (s .index [42 :65 ])
172151 expected .index = expected .index .droplevel (0 ).droplevel (0 )
152+
153+ result = indexer (s )
173154 tm .assert_series_equal (result , expected )
174155
175- result = s [2000 , 3 , 10 ]
176- expected = s [49 ]
156+
157+ @pytest .mark .parametrize ('indexer' , [
158+ lambda s : s [2000 , 3 , 10 ],
159+ lambda s : s .loc [2000 , 3 , 10 ]
160+ ])
161+ def test_series_getitem_returns_scalar (
162+ multiindex_year_month_day_dataframe_random_data , indexer ):
163+ s = multiindex_year_month_day_dataframe_random_data ['A' ]
164+ expected = s .iloc [49 ]
165+
166+ result = indexer (s )
177167 assert result == expected
178168
179- # fancy
169+
170+ @pytest .mark .filterwarnings ("ignore:\\ n.ix:DeprecationWarning" )
171+ @pytest .mark .parametrize ('indexer' , [
172+ lambda s : s .loc [[(2000 , 3 , 10 ), (2000 , 3 , 13 )]],
173+ lambda s : s .ix [[(2000 , 3 , 10 ), (2000 , 3 , 13 )]]
174+ ])
175+ def test_series_getitem_fancy (
176+ multiindex_year_month_day_dataframe_random_data , indexer ):
177+ s = multiindex_year_month_day_dataframe_random_data ['A' ]
180178 expected = s .reindex (s .index [49 :51 ])
181- result = s .loc [[(2000 , 3 , 10 ), (2000 , 3 , 13 )]]
182- tm .assert_series_equal (result , expected )
183179
184- result = s . ix [[( 2000 , 3 , 10 ), ( 2000 , 3 , 13 )]]
180+ result = indexer ( s )
185181 tm .assert_series_equal (result , expected )
186182
187- # key error
188- msg = "356"
189- with pytest .raises (KeyError , match = msg ):
190- s .__getitem__ ((2000 , 3 , 4 ))
191-
192183
193- def test_series_getitem_corner (
194- multiindex_year_month_day_dataframe_random_data ):
195- ymd = multiindex_year_month_day_dataframe_random_data
196- s = ymd ['A' ]
184+ @pytest .mark .parametrize ('indexer,error,msg' , [
185+ (lambda s : s .__getitem__ ((2000 , 3 , 4 )), KeyError , '356' ),
186+ (lambda s : s [(2000 , 3 , 4 )], KeyError , '356' ),
187+ (lambda s : s .loc [(2000 , 3 , 4 )], IndexingError , 'Too many indexers' ),
188+ (lambda s : s .__getitem__ (len (s )), IndexError , 'index out of bounds' ),
189+ (lambda s : s [len (s )], IndexError , 'index out of bounds' ),
190+ (lambda s : s .iloc [len (s )], IndexError ,
191+ 'single positional indexer is out-of-bounds' )
192+ ])
193+ def test_series_getitem_indexing_errors (
194+ multiindex_year_month_day_dataframe_random_data , indexer , error , msg ):
195+ s = multiindex_year_month_day_dataframe_random_data ['A' ]
196+ with pytest .raises (error , match = msg ):
197+ indexer (s )
197198
198- # don't segfault, GH #495
199- # out of bounds access
200- msg = "index out of bounds"
201- with pytest .raises (IndexError , match = msg ):
202- s .__getitem__ (len (ymd ))
203199
204- # generator
200+ def test_series_getitem_corner_generator (
201+ multiindex_year_month_day_dataframe_random_data ):
202+ s = multiindex_year_month_day_dataframe_random_data ['A' ]
205203 result = s [(x > 0 for x in s )]
206204 expected = s [s > 0 ]
207205 tm .assert_series_equal (result , expected )
0 commit comments