|
1 | 1 | from datetime import timedelta
|
2 | 2 | from decimal import Decimal
|
| 3 | +import re |
3 | 4 |
|
4 | 5 | from dateutil.tz import tzlocal
|
5 | 6 | import numpy as np
|
@@ -783,34 +784,35 @@ def test_sum_corner(self):
|
783 | 784 | assert len(axis1) == 0
|
784 | 785 |
|
785 | 786 | @pytest.mark.parametrize("method, unit", [("sum", 0), ("prod", 1)])
|
786 |
| - def test_sum_prod_nanops(self, method, unit): |
| 787 | + @pytest.mark.parametrize("numeric_only", [None, True, False]) |
| 788 | + def test_sum_prod_nanops(self, method, unit, numeric_only): |
787 | 789 | idx = ["a", "b", "c"]
|
788 | 790 | df = DataFrame({"a": [unit, unit], "b": [unit, np.nan], "c": [np.nan, np.nan]})
|
789 | 791 | # The default
|
790 |
| - result = getattr(df, method) |
| 792 | + result = getattr(df, method)(numeric_only=numeric_only) |
791 | 793 | expected = Series([unit, unit, unit], index=idx, dtype="float64")
|
792 | 794 |
|
793 | 795 | # min_count=1
|
794 |
| - result = getattr(df, method)(min_count=1) |
| 796 | + result = getattr(df, method)(numeric_only=numeric_only, min_count=1) |
795 | 797 | expected = Series([unit, unit, np.nan], index=idx)
|
796 | 798 | tm.assert_series_equal(result, expected)
|
797 | 799 |
|
798 | 800 | # min_count=0
|
799 |
| - result = getattr(df, method)(min_count=0) |
| 801 | + result = getattr(df, method)(numeric_only=numeric_only, min_count=0) |
800 | 802 | expected = Series([unit, unit, unit], index=idx, dtype="float64")
|
801 | 803 | tm.assert_series_equal(result, expected)
|
802 | 804 |
|
803 |
| - result = getattr(df.iloc[1:], method)(min_count=1) |
| 805 | + result = getattr(df.iloc[1:], method)(numeric_only=numeric_only, min_count=1) |
804 | 806 | expected = Series([unit, np.nan, np.nan], index=idx)
|
805 | 807 | tm.assert_series_equal(result, expected)
|
806 | 808 |
|
807 | 809 | # min_count > 1
|
808 | 810 | df = DataFrame({"A": [unit] * 10, "B": [unit] * 5 + [np.nan] * 5})
|
809 |
| - result = getattr(df, method)(min_count=5) |
| 811 | + result = getattr(df, method)(numeric_only=numeric_only, min_count=5) |
810 | 812 | expected = Series(result, index=["A", "B"])
|
811 | 813 | tm.assert_series_equal(result, expected)
|
812 | 814 |
|
813 |
| - result = getattr(df, method)(min_count=6) |
| 815 | + result = getattr(df, method)(numeric_only=numeric_only, min_count=6) |
814 | 816 | expected = Series(result, index=["A", "B"])
|
815 | 817 | tm.assert_series_equal(result, expected)
|
816 | 818 |
|
@@ -1491,3 +1493,15 @@ def test_minmax_extensionarray(method, numeric_only):
|
1491 | 1493 | [getattr(int64_info, method)], index=Index(["Int64"], dtype="object")
|
1492 | 1494 | )
|
1493 | 1495 | tm.assert_series_equal(result, expected)
|
| 1496 | + |
| 1497 | +def test_prod_sum_min_count_mixed_object(): |
| 1498 | + # https://github.com/pandas-dev/pandas/issues/41074 |
| 1499 | + df = DataFrame([1, "a", True]) |
| 1500 | + |
| 1501 | + result = df.prod(axis=0, min_count=1, numeric_only=False) |
| 1502 | + expected = Series(["a"]) |
| 1503 | + tm.assert_series_equal(result, expected) |
| 1504 | + |
| 1505 | + msg = re.escape("unsupported operand type(s) for +: 'int' and 'str'") |
| 1506 | + with pytest.raises(TypeError, match=msg): |
| 1507 | + df.sum(axis=0, min_count=1, numeric_only=False) |
0 commit comments