4
4
from pandas .compat import lrange , range , u , zip
5
5
6
6
import pandas as pd
7
- from pandas import DataFrame , Index , MultiIndex , Series , date_range
7
+ from pandas import DataFrame , Index , MultiIndex , Series
8
8
import pandas .core .common as com
9
+ from pandas .core .indexing import IndexingError
9
10
from pandas .util import testing as tm
10
11
11
12
@@ -27,29 +28,6 @@ def test_series_getitem_multiindex(access_method, level1_value, expected):
27
28
tm .assert_series_equal (result , expected )
28
29
29
30
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
-
53
31
@pytest .mark .parametrize ('level0_value' , ['D' , 'A' ])
54
32
def test_getitem_duplicates_multiindex (level0_value ):
55
33
# 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():
145
123
146
124
147
125
def 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 )
159
130
160
131
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 )
167
141
168
- # TODO(wesm): unused?
169
- # result2 = s.loc[2000, 3]
170
142
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' ]
171
150
expected = s .reindex (s .index [42 :65 ])
172
151
expected .index = expected .index .droplevel (0 ).droplevel (0 )
152
+
153
+ result = indexer (s )
173
154
tm .assert_series_equal (result , expected )
174
155
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 )
177
167
assert result == expected
178
168
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' ]
180
178
expected = s .reindex (s .index [49 :51 ])
181
- result = s .loc [[(2000 , 3 , 10 ), (2000 , 3 , 13 )]]
182
- tm .assert_series_equal (result , expected )
183
179
184
- result = s . ix [[( 2000 , 3 , 10 ), ( 2000 , 3 , 13 )]]
180
+ result = indexer ( s )
185
181
tm .assert_series_equal (result , expected )
186
182
187
- # key error
188
- msg = "356"
189
- with pytest .raises (KeyError , match = msg ):
190
- s .__getitem__ ((2000 , 3 , 4 ))
191
-
192
183
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 )
197
198
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 ))
203
199
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' ]
205
203
result = s [(x > 0 for x in s )]
206
204
expected = s [s > 0 ]
207
205
tm .assert_series_equal (result , expected )
0 commit comments