test_getitem.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. """
  2. Series.__getitem__ test classes are organized by the type of key passed.
  3. """
  4. from datetime import (
  5. date,
  6. datetime,
  7. time,
  8. )
  9. import numpy as np
  10. import pytest
  11. from pandas._libs.tslibs import (
  12. conversion,
  13. timezones,
  14. )
  15. from pandas.core.dtypes.common import is_scalar
  16. import pandas as pd
  17. from pandas import (
  18. Categorical,
  19. DataFrame,
  20. DatetimeIndex,
  21. Index,
  22. Series,
  23. Timestamp,
  24. date_range,
  25. period_range,
  26. timedelta_range,
  27. )
  28. import pandas._testing as tm
  29. from pandas.core.indexing import IndexingError
  30. from pandas.tseries.offsets import BDay
  31. class TestSeriesGetitemScalars:
  32. def test_getitem_object_index_float_string(self):
  33. # GH#17286
  34. ser = Series([1] * 4, index=Index(["a", "b", "c", 1.0]))
  35. assert ser["a"] == 1
  36. assert ser[1.0] == 1
  37. def test_getitem_float_keys_tuple_values(self):
  38. # see GH#13509
  39. # unique Index
  40. ser = Series([(1, 1), (2, 2), (3, 3)], index=[0.0, 0.1, 0.2], name="foo")
  41. result = ser[0.0]
  42. assert result == (1, 1)
  43. # non-unique Index
  44. expected = Series([(1, 1), (2, 2)], index=[0.0, 0.0], name="foo")
  45. ser = Series([(1, 1), (2, 2), (3, 3)], index=[0.0, 0.0, 0.2], name="foo")
  46. result = ser[0.0]
  47. tm.assert_series_equal(result, expected)
  48. def test_getitem_unrecognized_scalar(self):
  49. # GH#32684 a scalar key that is not recognized by lib.is_scalar
  50. # a series that might be produced via `frame.dtypes`
  51. ser = Series([1, 2], index=[np.dtype("O"), np.dtype("i8")])
  52. key = ser.index[1]
  53. result = ser[key]
  54. assert result == 2
  55. def test_getitem_negative_out_of_bounds(self):
  56. ser = Series(tm.rands_array(5, 10), index=tm.rands_array(10, 10))
  57. msg = "index -11 is out of bounds for axis 0 with size 10"
  58. with pytest.raises(IndexError, match=msg):
  59. ser[-11]
  60. def test_getitem_out_of_bounds_indexerror(self, datetime_series):
  61. # don't segfault, GH#495
  62. msg = r"index \d+ is out of bounds for axis 0 with size \d+"
  63. with pytest.raises(IndexError, match=msg):
  64. datetime_series[len(datetime_series)]
  65. def test_getitem_out_of_bounds_empty_rangeindex_keyerror(self):
  66. # GH#917
  67. # With a RangeIndex, an int key gives a KeyError
  68. ser = Series([], dtype=object)
  69. with pytest.raises(KeyError, match="-1"):
  70. ser[-1]
  71. def test_getitem_keyerror_with_integer_index(self, any_int_numpy_dtype):
  72. dtype = any_int_numpy_dtype
  73. ser = Series(np.random.randn(6), index=Index([0, 0, 1, 1, 2, 2], dtype=dtype))
  74. with pytest.raises(KeyError, match=r"^5$"):
  75. ser[5]
  76. with pytest.raises(KeyError, match=r"^'c'$"):
  77. ser["c"]
  78. # not monotonic
  79. ser = Series(np.random.randn(6), index=[2, 2, 0, 0, 1, 1])
  80. with pytest.raises(KeyError, match=r"^5$"):
  81. ser[5]
  82. with pytest.raises(KeyError, match=r"^'c'$"):
  83. ser["c"]
  84. def test_getitem_int64(self, datetime_series):
  85. idx = np.int64(5)
  86. assert datetime_series[idx] == datetime_series[5]
  87. def test_getitem_full_range(self):
  88. # github.com/pandas-dev/pandas/commit/4f433773141d2eb384325714a2776bcc5b2e20f7
  89. ser = Series(range(5), index=list(range(5)))
  90. result = ser[list(range(5))]
  91. tm.assert_series_equal(result, ser)
  92. # ------------------------------------------------------------------
  93. # Series with DatetimeIndex
  94. @pytest.mark.parametrize("tzstr", ["Europe/Berlin", "dateutil/Europe/Berlin"])
  95. def test_getitem_pydatetime_tz(self, tzstr):
  96. tz = timezones.maybe_get_tz(tzstr)
  97. index = date_range(
  98. start="2012-12-24 16:00", end="2012-12-24 18:00", freq="H", tz=tzstr
  99. )
  100. ts = Series(index=index, data=index.hour)
  101. time_pandas = Timestamp("2012-12-24 17:00", tz=tzstr)
  102. dt = datetime(2012, 12, 24, 17, 0)
  103. time_datetime = conversion.localize_pydatetime(dt, tz)
  104. assert ts[time_pandas] == ts[time_datetime]
  105. @pytest.mark.parametrize("tz", ["US/Eastern", "dateutil/US/Eastern"])
  106. def test_string_index_alias_tz_aware(self, tz):
  107. rng = date_range("1/1/2000", periods=10, tz=tz)
  108. ser = Series(np.random.randn(len(rng)), index=rng)
  109. result = ser["1/3/2000"]
  110. tm.assert_almost_equal(result, ser[2])
  111. def test_getitem_time_object(self):
  112. rng = date_range("1/1/2000", "1/5/2000", freq="5min")
  113. ts = Series(np.random.randn(len(rng)), index=rng)
  114. mask = (rng.hour == 9) & (rng.minute == 30)
  115. result = ts[time(9, 30)]
  116. expected = ts[mask]
  117. result.index = result.index._with_freq(None)
  118. tm.assert_series_equal(result, expected)
  119. # ------------------------------------------------------------------
  120. # Series with CategoricalIndex
  121. def test_getitem_scalar_categorical_index(self):
  122. cats = Categorical([Timestamp("12-31-1999"), Timestamp("12-31-2000")])
  123. ser = Series([1, 2], index=cats)
  124. expected = ser.iloc[0]
  125. result = ser[cats[0]]
  126. assert result == expected
  127. def test_getitem_numeric_categorical_listlike_matches_scalar(self):
  128. # GH#15470
  129. ser = Series(["a", "b", "c"], index=pd.CategoricalIndex([2, 1, 0]))
  130. # 0 is treated as a label
  131. assert ser[0] == "c"
  132. # the listlike analogue should also be treated as labels
  133. res = ser[[0]]
  134. expected = ser.iloc[-1:]
  135. tm.assert_series_equal(res, expected)
  136. res2 = ser[[0, 1, 2]]
  137. tm.assert_series_equal(res2, ser.iloc[::-1])
  138. def test_getitem_integer_categorical_not_positional(self):
  139. # GH#14865
  140. ser = Series(["a", "b", "c"], index=Index([1, 2, 3], dtype="category"))
  141. assert ser.get(3) == "c"
  142. assert ser[3] == "c"
  143. def test_getitem_str_with_timedeltaindex(self):
  144. rng = timedelta_range("1 day 10:11:12", freq="h", periods=500)
  145. ser = Series(np.arange(len(rng)), index=rng)
  146. key = "6 days, 23:11:12"
  147. indexer = rng.get_loc(key)
  148. assert indexer == 133
  149. result = ser[key]
  150. assert result == ser.iloc[133]
  151. msg = r"^Timedelta\('50 days 00:00:00'\)$"
  152. with pytest.raises(KeyError, match=msg):
  153. rng.get_loc("50 days")
  154. with pytest.raises(KeyError, match=msg):
  155. ser["50 days"]
  156. def test_getitem_bool_index_positional(self):
  157. # GH#48653
  158. ser = Series({True: 1, False: 0})
  159. result = ser[0]
  160. assert result == 1
  161. class TestSeriesGetitemSlices:
  162. def test_getitem_partial_str_slice_with_datetimeindex(self):
  163. # GH#34860
  164. arr = date_range("1/1/2008", "1/1/2009")
  165. ser = arr.to_series()
  166. result = ser["2008"]
  167. rng = date_range(start="2008-01-01", end="2008-12-31")
  168. expected = Series(rng, index=rng)
  169. tm.assert_series_equal(result, expected)
  170. def test_getitem_slice_strings_with_datetimeindex(self):
  171. idx = DatetimeIndex(
  172. ["1/1/2000", "1/2/2000", "1/2/2000", "1/3/2000", "1/4/2000"]
  173. )
  174. ts = Series(np.random.randn(len(idx)), index=idx)
  175. result = ts["1/2/2000":]
  176. expected = ts[1:]
  177. tm.assert_series_equal(result, expected)
  178. result = ts["1/2/2000":"1/3/2000"]
  179. expected = ts[1:4]
  180. tm.assert_series_equal(result, expected)
  181. def test_getitem_partial_str_slice_with_timedeltaindex(self):
  182. rng = timedelta_range("1 day 10:11:12", freq="h", periods=500)
  183. ser = Series(np.arange(len(rng)), index=rng)
  184. result = ser["5 day":"6 day"]
  185. expected = ser.iloc[86:134]
  186. tm.assert_series_equal(result, expected)
  187. result = ser["5 day":]
  188. expected = ser.iloc[86:]
  189. tm.assert_series_equal(result, expected)
  190. result = ser[:"6 day"]
  191. expected = ser.iloc[:134]
  192. tm.assert_series_equal(result, expected)
  193. def test_getitem_partial_str_slice_high_reso_with_timedeltaindex(self):
  194. # higher reso
  195. rng = timedelta_range("1 day 10:11:12", freq="us", periods=2000)
  196. ser = Series(np.arange(len(rng)), index=rng)
  197. result = ser["1 day 10:11:12":]
  198. expected = ser.iloc[0:]
  199. tm.assert_series_equal(result, expected)
  200. result = ser["1 day 10:11:12.001":]
  201. expected = ser.iloc[1000:]
  202. tm.assert_series_equal(result, expected)
  203. result = ser["1 days, 10:11:12.001001"]
  204. assert result == ser.iloc[1001]
  205. def test_getitem_slice_2d(self, datetime_series):
  206. # GH#30588 multi-dimensional indexing deprecated
  207. with pytest.raises(ValueError, match="Multi-dimensional indexing"):
  208. datetime_series[:, np.newaxis]
  209. def test_getitem_median_slice_bug(self):
  210. index = date_range("20090415", "20090519", freq="2B")
  211. ser = Series(np.random.randn(13), index=index)
  212. indexer = [slice(6, 7, None)]
  213. msg = "Indexing with a single-item list"
  214. with pytest.raises(ValueError, match=msg):
  215. # GH#31299
  216. ser[indexer]
  217. # but we're OK with a single-element tuple
  218. result = ser[(indexer[0],)]
  219. expected = ser[indexer[0]]
  220. tm.assert_series_equal(result, expected)
  221. @pytest.mark.parametrize(
  222. "slc, positions",
  223. [
  224. [slice(date(2018, 1, 1), None), [0, 1, 2]],
  225. [slice(date(2019, 1, 2), None), [2]],
  226. [slice(date(2020, 1, 1), None), []],
  227. [slice(None, date(2020, 1, 1)), [0, 1, 2]],
  228. [slice(None, date(2019, 1, 1)), [0]],
  229. ],
  230. )
  231. def test_getitem_slice_date(self, slc, positions):
  232. # https://github.com/pandas-dev/pandas/issues/31501
  233. ser = Series(
  234. [0, 1, 2],
  235. DatetimeIndex(["2019-01-01", "2019-01-01T06:00:00", "2019-01-02"]),
  236. )
  237. result = ser[slc]
  238. expected = ser.take(positions)
  239. tm.assert_series_equal(result, expected)
  240. def test_getitem_slice_float_raises(self, datetime_series):
  241. msg = (
  242. "cannot do slice indexing on DatetimeIndex with these indexers "
  243. r"\[{key}\] of type float"
  244. )
  245. with pytest.raises(TypeError, match=msg.format(key=r"4\.0")):
  246. datetime_series[4.0:10.0]
  247. with pytest.raises(TypeError, match=msg.format(key=r"4\.5")):
  248. datetime_series[4.5:10.0]
  249. def test_getitem_slice_bug(self):
  250. ser = Series(range(10), index=list(range(10)))
  251. result = ser[-12:]
  252. tm.assert_series_equal(result, ser)
  253. result = ser[-7:]
  254. tm.assert_series_equal(result, ser[3:])
  255. result = ser[:-12]
  256. tm.assert_series_equal(result, ser[:0])
  257. def test_getitem_slice_integers(self):
  258. ser = Series(np.random.randn(8), index=[2, 4, 6, 8, 10, 12, 14, 16])
  259. result = ser[:4]
  260. expected = Series(ser.values[:4], index=[2, 4, 6, 8])
  261. tm.assert_series_equal(result, expected)
  262. class TestSeriesGetitemListLike:
  263. @pytest.mark.parametrize("box", [list, np.array, Index, Series])
  264. def test_getitem_no_matches(self, box):
  265. # GH#33462 we expect the same behavior for list/ndarray/Index/Series
  266. ser = Series(["A", "B"])
  267. key = Series(["C"], dtype=object)
  268. key = box(key)
  269. msg = r"None of \[Index\(\['C'\], dtype='object'\)\] are in the \[index\]"
  270. with pytest.raises(KeyError, match=msg):
  271. ser[key]
  272. def test_getitem_intlist_intindex_periodvalues(self):
  273. ser = Series(period_range("2000-01-01", periods=10, freq="D"))
  274. result = ser[[2, 4]]
  275. exp = Series(
  276. [pd.Period("2000-01-03", freq="D"), pd.Period("2000-01-05", freq="D")],
  277. index=[2, 4],
  278. dtype="Period[D]",
  279. )
  280. tm.assert_series_equal(result, exp)
  281. assert result.dtype == "Period[D]"
  282. @pytest.mark.parametrize("box", [list, np.array, Index])
  283. def test_getitem_intlist_intervalindex_non_int(self, box):
  284. # GH#33404 fall back to positional since ints are unambiguous
  285. dti = date_range("2000-01-03", periods=3)._with_freq(None)
  286. ii = pd.IntervalIndex.from_breaks(dti)
  287. ser = Series(range(len(ii)), index=ii)
  288. expected = ser.iloc[:1]
  289. key = box([0])
  290. result = ser[key]
  291. tm.assert_series_equal(result, expected)
  292. @pytest.mark.parametrize("box", [list, np.array, Index])
  293. @pytest.mark.parametrize("dtype", [np.int64, np.float64, np.uint64])
  294. def test_getitem_intlist_multiindex_numeric_level(self, dtype, box):
  295. # GH#33404 do _not_ fall back to positional since ints are ambiguous
  296. idx = Index(range(4)).astype(dtype)
  297. dti = date_range("2000-01-03", periods=3)
  298. mi = pd.MultiIndex.from_product([idx, dti])
  299. ser = Series(range(len(mi))[::-1], index=mi)
  300. key = box([5])
  301. with pytest.raises(KeyError, match="5"):
  302. ser[key]
  303. def test_getitem_uint_array_key(self, any_unsigned_int_numpy_dtype):
  304. # GH #37218
  305. ser = Series([1, 2, 3])
  306. key = np.array([4], dtype=any_unsigned_int_numpy_dtype)
  307. with pytest.raises(KeyError, match="4"):
  308. ser[key]
  309. with pytest.raises(KeyError, match="4"):
  310. ser.loc[key]
  311. class TestGetitemBooleanMask:
  312. def test_getitem_boolean(self, string_series):
  313. ser = string_series
  314. mask = ser > ser.median()
  315. # passing list is OK
  316. result = ser[list(mask)]
  317. expected = ser[mask]
  318. tm.assert_series_equal(result, expected)
  319. tm.assert_index_equal(result.index, ser.index[mask])
  320. def test_getitem_boolean_empty(self):
  321. ser = Series([], dtype=np.int64)
  322. ser.index.name = "index_name"
  323. ser = ser[ser.isna()]
  324. assert ser.index.name == "index_name"
  325. assert ser.dtype == np.int64
  326. # GH#5877
  327. # indexing with empty series
  328. ser = Series(["A", "B"])
  329. expected = Series(dtype=object, index=Index([], dtype="int64"))
  330. result = ser[Series([], dtype=object)]
  331. tm.assert_series_equal(result, expected)
  332. # invalid because of the boolean indexer
  333. # that's empty or not-aligned
  334. msg = (
  335. r"Unalignable boolean Series provided as indexer \(index of "
  336. r"the boolean Series and of the indexed object do not match"
  337. )
  338. with pytest.raises(IndexingError, match=msg):
  339. ser[Series([], dtype=bool)]
  340. with pytest.raises(IndexingError, match=msg):
  341. ser[Series([True], dtype=bool)]
  342. def test_getitem_boolean_object(self, string_series):
  343. # using column from DataFrame
  344. ser = string_series
  345. mask = ser > ser.median()
  346. omask = mask.astype(object)
  347. # getitem
  348. result = ser[omask]
  349. expected = ser[mask]
  350. tm.assert_series_equal(result, expected)
  351. # setitem
  352. s2 = ser.copy()
  353. cop = ser.copy()
  354. cop[omask] = 5
  355. s2[mask] = 5
  356. tm.assert_series_equal(cop, s2)
  357. # nans raise exception
  358. omask[5:10] = np.nan
  359. msg = "Cannot mask with non-boolean array containing NA / NaN values"
  360. with pytest.raises(ValueError, match=msg):
  361. ser[omask]
  362. with pytest.raises(ValueError, match=msg):
  363. ser[omask] = 5
  364. def test_getitem_boolean_dt64_copies(self):
  365. # GH#36210
  366. dti = date_range("2016-01-01", periods=4, tz="US/Pacific")
  367. key = np.array([True, True, False, False])
  368. ser = Series(dti._data)
  369. res = ser[key]
  370. assert res._values._ndarray.base is None
  371. # compare with numeric case for reference
  372. ser2 = Series(range(4))
  373. res2 = ser2[key]
  374. assert res2._values.base is None
  375. def test_getitem_boolean_corner(self, datetime_series):
  376. ts = datetime_series
  377. mask_shifted = ts.shift(1, freq=BDay()) > ts.median()
  378. msg = (
  379. r"Unalignable boolean Series provided as indexer \(index of "
  380. r"the boolean Series and of the indexed object do not match"
  381. )
  382. with pytest.raises(IndexingError, match=msg):
  383. ts[mask_shifted]
  384. with pytest.raises(IndexingError, match=msg):
  385. ts.loc[mask_shifted]
  386. def test_getitem_boolean_different_order(self, string_series):
  387. ordered = string_series.sort_values()
  388. sel = string_series[ordered > 0]
  389. exp = string_series[string_series > 0]
  390. tm.assert_series_equal(sel, exp)
  391. def test_getitem_boolean_contiguous_preserve_freq(self):
  392. rng = date_range("1/1/2000", "3/1/2000", freq="B")
  393. mask = np.zeros(len(rng), dtype=bool)
  394. mask[10:20] = True
  395. masked = rng[mask]
  396. expected = rng[10:20]
  397. assert expected.freq == rng.freq
  398. tm.assert_index_equal(masked, expected)
  399. mask[22] = True
  400. masked = rng[mask]
  401. assert masked.freq is None
  402. class TestGetitemCallable:
  403. def test_getitem_callable(self):
  404. # GH#12533
  405. ser = Series(4, index=list("ABCD"))
  406. result = ser[lambda x: "A"]
  407. assert result == ser.loc["A"]
  408. result = ser[lambda x: ["A", "B"]]
  409. expected = ser.loc[["A", "B"]]
  410. tm.assert_series_equal(result, expected)
  411. result = ser[lambda x: [True, False, True, True]]
  412. expected = ser.iloc[[0, 2, 3]]
  413. tm.assert_series_equal(result, expected)
  414. def test_getitem_generator(string_series):
  415. gen = (x > 0 for x in string_series)
  416. result = string_series[gen]
  417. result2 = string_series[iter(string_series > 0)]
  418. expected = string_series[string_series > 0]
  419. tm.assert_series_equal(result, expected)
  420. tm.assert_series_equal(result2, expected)
  421. @pytest.mark.parametrize(
  422. "series",
  423. [
  424. Series([0, 1]),
  425. Series(date_range("2012-01-01", periods=2)),
  426. Series(date_range("2012-01-01", periods=2, tz="CET")),
  427. ],
  428. )
  429. def test_getitem_ndim_deprecated(series):
  430. with pytest.raises(ValueError, match="Multi-dimensional indexing"):
  431. series[:, None]
  432. def test_getitem_multilevel_scalar_slice_not_implemented(
  433. multiindex_year_month_day_dataframe_random_data,
  434. ):
  435. # not implementing this for now
  436. df = multiindex_year_month_day_dataframe_random_data
  437. ser = df["A"]
  438. msg = r"\(2000, slice\(3, 4, None\)\)"
  439. with pytest.raises(TypeError, match=msg):
  440. ser[2000, 3:4]
  441. def test_getitem_dataframe_raises():
  442. rng = list(range(10))
  443. ser = Series(10, index=rng)
  444. df = DataFrame(rng, index=rng)
  445. msg = (
  446. "Indexing a Series with DataFrame is not supported, "
  447. "use the appropriate DataFrame column"
  448. )
  449. with pytest.raises(TypeError, match=msg):
  450. ser[df > 5]
  451. def test_getitem_assignment_series_aligment():
  452. # https://github.com/pandas-dev/pandas/issues/37427
  453. # with getitem, when assigning with a Series, it is not first aligned
  454. ser = Series(range(10))
  455. idx = np.array([2, 4, 9])
  456. ser[idx] = Series([10, 11, 12])
  457. expected = Series([0, 1, 10, 3, 11, 5, 6, 7, 8, 12])
  458. tm.assert_series_equal(ser, expected)
  459. def test_getitem_duplicate_index_mistyped_key_raises_keyerror():
  460. # GH#29189 float_index.get_loc(None) should raise KeyError, not TypeError
  461. ser = Series([2, 5, 6, 8], index=[2.0, 4.0, 4.0, 5.0])
  462. with pytest.raises(KeyError, match="None"):
  463. ser[None]
  464. with pytest.raises(KeyError, match="None"):
  465. ser.index.get_loc(None)
  466. with pytest.raises(KeyError, match="None"):
  467. ser.index._engine.get_loc(None)
  468. def test_getitem_1tuple_slice_without_multiindex():
  469. ser = Series(range(5))
  470. key = (slice(3),)
  471. result = ser[key]
  472. expected = ser[key[0]]
  473. tm.assert_series_equal(result, expected)
  474. def test_getitem_preserve_name(datetime_series):
  475. result = datetime_series[datetime_series > 0]
  476. assert result.name == datetime_series.name
  477. result = datetime_series[[0, 2, 4]]
  478. assert result.name == datetime_series.name
  479. result = datetime_series[5:10]
  480. assert result.name == datetime_series.name
  481. def test_getitem_with_integer_labels():
  482. # integer indexes, be careful
  483. ser = Series(np.random.randn(10), index=list(range(0, 20, 2)))
  484. inds = [0, 2, 5, 7, 8]
  485. arr_inds = np.array([0, 2, 5, 7, 8])
  486. with pytest.raises(KeyError, match="not in index"):
  487. ser[inds]
  488. with pytest.raises(KeyError, match="not in index"):
  489. ser[arr_inds]
  490. def test_getitem_missing(datetime_series):
  491. # missing
  492. d = datetime_series.index[0] - BDay()
  493. msg = r"Timestamp\('1999-12-31 00:00:00'\)"
  494. with pytest.raises(KeyError, match=msg):
  495. datetime_series[d]
  496. def test_getitem_fancy(string_series, object_series):
  497. slice1 = string_series[[1, 2, 3]]
  498. slice2 = object_series[[1, 2, 3]]
  499. assert string_series.index[2] == slice1.index[1]
  500. assert object_series.index[2] == slice2.index[1]
  501. assert string_series[2] == slice1[1]
  502. assert object_series[2] == slice2[1]
  503. def test_getitem_box_float64(datetime_series):
  504. value = datetime_series[5]
  505. assert isinstance(value, np.float64)
  506. def test_getitem_unordered_dup():
  507. obj = Series(range(5), index=["c", "a", "a", "b", "b"])
  508. assert is_scalar(obj["c"])
  509. assert obj["c"] == 0
  510. def test_getitem_dups():
  511. ser = Series(range(5), index=["A", "A", "B", "C", "C"], dtype=np.int64)
  512. expected = Series([3, 4], index=["C", "C"], dtype=np.int64)
  513. result = ser["C"]
  514. tm.assert_series_equal(result, expected)
  515. def test_getitem_categorical_str():
  516. # GH#31765
  517. ser = Series(range(5), index=Categorical(["a", "b", "c", "a", "b"]))
  518. result = ser["a"]
  519. expected = ser.iloc[[0, 3]]
  520. tm.assert_series_equal(result, expected)
  521. def test_slice_can_reorder_not_uniquely_indexed():
  522. ser = Series(1, index=["a", "a", "b", "b", "c"])
  523. ser[::-1] # it works!
  524. @pytest.mark.parametrize("index_vals", ["aabcd", "aadcb"])
  525. def test_duplicated_index_getitem_positional_indexer(index_vals):
  526. # GH 11747
  527. s = Series(range(5), index=list(index_vals))
  528. result = s[3]
  529. assert result == 3
  530. class TestGetitemDeprecatedIndexers:
  531. @pytest.mark.parametrize("key", [{1}, {1: 1}])
  532. def test_getitem_dict_and_set_deprecated(self, key):
  533. # GH#42825 enforced in 2.0
  534. ser = Series([1, 2, 3])
  535. with pytest.raises(TypeError, match="as an indexer is not supported"):
  536. ser[key]
  537. @pytest.mark.parametrize("key", [{1}, {1: 1}])
  538. def test_setitem_dict_and_set_disallowed(self, key):
  539. # GH#42825 enforced in 2.0
  540. ser = Series([1, 2, 3])
  541. with pytest.raises(TypeError, match="as an indexer is not supported"):
  542. ser[key] = 1