diff --git a/pandas/core/groupby/ops.py b/pandas/core/groupby/ops.py index da80969b613cd..703c270132a02 100644 --- a/pandas/core/groupby/ops.py +++ b/pandas/core/groupby/ops.py @@ -379,6 +379,12 @@ def _call_cython_op( if values.dtype == "float16": values = values.astype(np.float32) + values = values.T + if mask is not None: + mask = mask.T + if result_mask is not None: + result_mask = result_mask.T + if self.how in ["any", "all"]: if mask is None: mask = isna(values) @@ -392,12 +398,6 @@ def _call_cython_op( values = values.astype(bool, copy=False).view(np.int8) is_numeric = True - values = values.T - if mask is not None: - mask = mask.T - if result_mask is not None: - result_mask = result_mask.T - out_shape = self._get_output_shape(ngroups, values) func = self._get_cython_function(self.kind, self.how, values.dtype, is_numeric) values = self._get_cython_vals(values) diff --git a/pandas/tests/groupby/test_grouping.py b/pandas/tests/groupby/test_grouping.py index fc2a8a970010a..b1d84f8ac4657 100644 --- a/pandas/tests/groupby/test_grouping.py +++ b/pandas/tests/groupby/test_grouping.py @@ -1180,3 +1180,15 @@ def test_grouping_by_key_is_in_axis(): result = gb.sum() expected = DataFrame({"a": [1, 2], "b": [1, 2], "c": [7, 5]}) tm.assert_frame_equal(result, expected) + +def test_groupby_any_timedelta_with_all_nulls(): + # Create a DataFrame with timedelta values, including NaT (null timedelta) + df = pd.DataFrame({ + 'timedelta': [pd.Timedelta(days=1), pd.NaT], + 'group': [0, 1] + }) + result = df.groupby('group')['timedelta'].any() + + # Expected behavior: group 1 should return False because it has all null values + expected = pd.Series([True, False], index=[0, 1]) + pd.testing.assert_series_equal(result, expected)