Skip to content

Commit 339052f

Browse files
committed
change to 0.24 and parametrize series tests
1 parent 2f7262e commit 339052f

File tree

6 files changed

+60
-43
lines changed

6 files changed

+60
-43
lines changed

doc/source/whatsnew/v0.24.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ New features
1212

1313
Other Enhancements
1414
^^^^^^^^^^^^^^^^^^
15-
-
15+
- :func:`Series.mode` and :func:`DataFrame.mode` now support the ``dropna`` parameter which can be used to specify whether NaN/NaT values should be considered (:issue:`17534`)
1616
-
1717
-
1818

pandas/core/algorithms.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -809,7 +809,7 @@ def mode(values, dropna=True):
809809
dropna : boolean, default True
810810
Don't consider counts of NaN/NaT.
811811
812-
.. versionadded:: 0.23.0
812+
.. versionadded:: 0.24.0
813813
814814
Returns
815815
-------

pandas/core/arrays/categorical.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2128,7 +2128,7 @@ def mode(self, dropna=True):
21282128
dropna : boolean, default True
21292129
Don't consider counts of NaN/NaT.
21302130
2131-
.. versionadded:: 0.23.0
2131+
.. versionadded:: 0.24.0
21322132
21332133
Returns
21342134
-------

pandas/core/frame.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7057,7 +7057,7 @@ def mode(self, axis=0, numeric_only=False, dropna=True):
70577057
dropna : boolean, default True
70587058
Don't consider counts of NaN/NaT.
70597059
7060-
.. versionadded:: 0.23.0
7060+
.. versionadded:: 0.24.0
70617061
70627062
Returns
70637063
-------

pandas/core/series.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1441,7 +1441,7 @@ def mode(self, dropna=True):
14411441
dropna : boolean, default True
14421442
Don't consider counts of NaN/NaT.
14431443
1444-
.. versionadded:: 0.23.0
1444+
.. versionadded:: 0.24.0
14451445
14461446
Returns
14471447
-------

pandas/tests/series/test_analytics.py

+55-38
Original file line numberDiff line numberDiff line change
@@ -231,28 +231,33 @@ def test_median(self):
231231
])
232232
def test_mode_empty(self, dropna, expected):
233233
s = Series([], dtype=np.float64)
234-
tm.assert_series_equal(s.mode(dropna), expected)
234+
result = s.mode(dropna)
235+
tm.assert_series_equal(result, expected)
235236

236-
@pytest.mark.parametrize('dropna, expected1, expected2, expected3', [
237-
(True, [1], [1, 3], [1.0]),
238-
(False, [1], [1, 3], [1, np.nan]),
237+
@pytest.mark.parametrize('dropna, data, expected', [
238+
(True, [1, 1, 1, 2], [1]),
239+
(True, [1, 1, 1, 2, 3, 3, 3], [1, 3]),
240+
(False, [1, 1, 1, 2], [1]),
241+
(False, [1, 1, 1, 2, 3, 3, 3], [1, 3]),
239242
])
240-
def test_mode_numerical(self, dropna, expected1, expected2, expected3):
241-
data_single = [1] * 5 + [2] * 3
242-
data_multi = [1] * 5 + [2] * 3 + [3] * 5
243-
244-
for dt in np.typecodes['AllInteger'] + np.typecodes['Float']:
245-
s = Series(data_single, dtype=dt)
246-
expected1 = Series(expected1, dtype=dt)
247-
tm.assert_series_equal(s.mode(dropna), expected1)
248-
249-
s = Series(data_multi, dtype=dt)
250-
expected2 = Series(expected2, dtype=dt)
251-
tm.assert_series_equal(s.mode(dropna), expected2)
243+
@pytest.mark.parametrize('dt',
244+
list(np.typecodes['AllInteger'] + np.typecodes['Float'])
245+
)
246+
def test_mode_numerical(self, dropna, data, expected, dt):
247+
s = Series(data, dtype=dt)
248+
result = s.mode(dropna)
249+
expected = Series(expected, dtype=dt)
250+
tm.assert_series_equal(result, expected)
252251

253-
s = Series([1, np.nan])
254-
expected = Series(expected3)
255-
tm.assert_series_equal(s.mode(dropna), expected)
252+
@pytest.mark.parametrize('dropna, expected', [
253+
(True, [1.0]),
254+
(False, [1, np.nan]),
255+
])
256+
def test_mode_numerical_nan(self, dropna, expected):
257+
s = Series([1, 1, 2, np.nan, np.nan])
258+
result = s.mode(dropna)
259+
expected = Series(expected)
260+
tm.assert_series_equal(result, expected)
256261

257262
@pytest.mark.parametrize('dropna, expected1, expected2, expected3', [
258263
(True, ['b'], ['bar'], ['nan']),
@@ -263,34 +268,37 @@ def test_mode_str_obj(self, dropna, expected1, expected2, expected3):
263268
data = ['a'] * 2 + ['b'] * 3
264269

265270
s = Series(data, dtype='c')
271+
result = s.mode(dropna)
266272
expected1 = Series(expected1, dtype='c')
267-
tm.assert_series_equal(s.mode(dropna), expected1)
273+
tm.assert_series_equal(result, expected1)
268274

269275
data = ['foo', 'bar', 'bar', np.nan, np.nan, np.nan]
270276

271277
s = Series(data, dtype=object)
272-
expected2 = Series(expected2, dtype=object)
273278
result = s.mode(dropna).sort_values().reset_index(drop=True)
279+
expected2 = Series(expected2, dtype=object)
274280
tm.assert_series_equal(result, expected2)
275281

276282
data = ['foo', 'bar', 'bar', np.nan, np.nan, np.nan]
277283

278284
s = Series(data, dtype=str)
285+
result = s.mode(dropna)
279286
expected3 = Series(expected3, dtype=str)
280-
tm.assert_series_equal(s.mode(dropna), expected3)
287+
tm.assert_series_equal(result, expected3)
281288

282289
@pytest.mark.parametrize('dropna, expected1, expected2', [
283290
(True, ['foo'], ['foo']),
284291
(False, ['foo'], [np.nan])
285292
])
286293
def test_mode_mixeddtype(self, dropna, expected1, expected2):
287-
expected = Series(expected1)
288294
s = Series([1, 'foo', 'foo'])
289-
tm.assert_series_equal(s.mode(dropna), expected)
295+
result = s.mode(dropna)
296+
expected = Series(expected1)
297+
tm.assert_series_equal(result, expected)
290298

291-
expected = Series(expected2, dtype=object)
292299
s = Series([1, 'foo', 'foo', np.nan, np.nan, np.nan])
293300
result = s.mode(dropna).sort_values().reset_index(drop=True)
301+
expected = Series(expected2, dtype=object)
294302
tm.assert_series_equal(result, expected)
295303

296304
@pytest.mark.parametrize('dropna, expected1, expected2', [
@@ -299,16 +307,18 @@ def test_mode_mixeddtype(self, dropna, expected1, expected2):
299307
(False, [np.nan], [np.nan, '2011-01-03', '2013-01-02']),
300308
])
301309
def test_mode_datetime(self, dropna, expected1, expected2):
302-
expected1 = Series(expected1, dtype='M8[ns]')
303310
s = Series(['2011-01-03', '2013-01-02',
304311
'1900-05-03', 'nan', 'nan'], dtype='M8[ns]')
305-
tm.assert_series_equal(s.mode(dropna), expected1)
312+
result = s.mode(dropna)
313+
expected1 = Series(expected1, dtype='M8[ns]')
314+
tm.assert_series_equal(result, expected1)
306315

307-
expected2 = Series(expected2, dtype='M8[ns]')
308316
s = Series(['2011-01-03', '2013-01-02', '1900-05-03',
309317
'2011-01-03', '2013-01-02', 'nan', 'nan'],
310318
dtype='M8[ns]')
311-
tm.assert_series_equal(s.mode(dropna), expected2)
319+
result = s.mode(dropna)
320+
expected2 = Series(expected2, dtype='M8[ns]')
321+
tm.assert_series_equal(result, expected2)
312322

313323
@pytest.mark.parametrize('dropna, expected1, expected2', [
314324
(True, ['-1 days', '0 days', '1 days'], ['2 min', '1 day']),
@@ -319,14 +329,16 @@ def test_mode_timedelta(self, dropna, expected1, expected2):
319329

320330
s = Series(['1 days', '-1 days', '0 days', 'nan', 'nan'],
321331
dtype='timedelta64[ns]')
332+
result = s.mode(dropna)
322333
expected1 = Series(expected1, dtype='timedelta64[ns]')
323-
tm.assert_series_equal(s.mode(dropna), expected1)
334+
tm.assert_series_equal(result, expected1)
324335

325336
s = Series(['1 day', '1 day', '-1 day', '-1 day 2 min',
326337
'2 min', '2 min', 'nan', 'nan'],
327338
dtype='timedelta64[ns]')
339+
result = s.mode(dropna)
328340
expected2 = Series(expected2, dtype='timedelta64[ns]')
329-
tm.assert_series_equal(s.mode(dropna), expected2)
341+
tm.assert_series_equal(result, expected2)
330342

331343
@pytest.mark.parametrize('dropna, expected1, expected2, expected3', [
332344
(True, Categorical([1, 2], categories=[1, 2]),
@@ -338,30 +350,35 @@ def test_mode_timedelta(self, dropna, expected1, expected2):
338350
])
339351
def test_mode_category(self, dropna, expected1, expected2, expected3):
340352
s = Series(Categorical([1, 2, np.nan, np.nan]))
353+
result = s.mode(dropna)
341354
expected1 = Series(expected1, dtype='category')
342-
tm.assert_series_equal(s.mode(dropna), expected1)
355+
tm.assert_series_equal(result, expected1)
343356

344357
s = Series(Categorical([1, 'a', 'a', np.nan, np.nan]))
358+
result = s.mode(dropna)
345359
expected2 = Series(expected2, dtype='category')
346-
tm.assert_series_equal(s.mode(dropna), expected2)
360+
tm.assert_series_equal(result, expected2)
347361

348362
s = Series(Categorical([1, 1, 2, 3, 3, np.nan, np.nan]))
363+
result = s.mode(dropna)
349364
expected3 = Series(expected3, dtype='category')
350-
tm.assert_series_equal(s.mode(dropna), expected3)
365+
tm.assert_series_equal(result, expected3)
351366

352367
@pytest.mark.parametrize('dropna, expected1, expected2', [
353368
(True, [2**63], [1, 2**63]),
354369
(False, [2**63], [1, 2**63])
355370
])
356371
def test_mode_intoverflow(self, dropna, expected1, expected2):
357372
# Test for uint64 overflow.
358-
expected1 = Series(expected1, dtype=np.uint64)
359373
s = Series([1, 2**63, 2**63], dtype=np.uint64)
360-
tm.assert_series_equal(s.mode(dropna), expected1)
374+
result = s.mode(dropna)
375+
expected1 = Series(expected1, dtype=np.uint64)
376+
tm.assert_series_equal(result, expected1)
361377

362-
expected2 = Series(expected2, dtype=np.uint64)
363378
s = Series([1, 2**63], dtype=np.uint64)
364-
tm.assert_series_equal(s.mode(dropna), expected2)
379+
result = s.mode(dropna)
380+
expected2 = Series(expected2, dtype=np.uint64)
381+
tm.assert_series_equal(result, expected2)
365382

366383
@pytest.mark.skipif(not compat.PY3, reason="only PY3")
367384
def test_mode_sortwarning(self):

0 commit comments

Comments
 (0)