diff --git a/pandas/core/groupby/groupby.py b/pandas/core/groupby/groupby.py index 3d857e4f3e4e7..7af394e744f1a 100644 --- a/pandas/core/groupby/groupby.py +++ b/pandas/core/groupby/groupby.py @@ -2179,6 +2179,14 @@ def sum( npfunc=np.sum, ) + if isinstance(result, DataFrame): + try: + dtypes = self.dtypes + for column in result.columns: + result[column] = result[column].astype(dtypes[column].dtype) + except Exception: + pass + return self._reindex_output(result, fill_value=0) @final diff --git a/pandas/tests/groupby/test_groupby.py b/pandas/tests/groupby/test_groupby.py index 7bf63bb3c2cac..5e830fa105185 100644 --- a/pandas/tests/groupby/test_groupby.py +++ b/pandas/tests/groupby/test_groupby.py @@ -20,6 +20,7 @@ Timestamp, date_range, to_datetime, + util, ) import pandas._testing as tm from pandas.core.arrays import BooleanArray @@ -2654,3 +2655,24 @@ def test_pad_backfill_deprecation(): s.groupby(level=0).backfill() with tm.assert_produces_warning(FutureWarning, match="pad"): s.groupby(level=0).pad() + + +def test_groupby_agg_general_dtypes(): + # GH 44132 + df = util.testing.makeMixedDataFrame() + df = df.to_numpy() + df = DataFrame(df) + df.columns = ["A", "B", "C", "D"] + df = df.set_index("B") + + df1, df2 = df.iloc[:2], df.iloc[2:] + + groupby1 = df1.groupby("B").sum() + groupby2 = df2.groupby("B").sum() + + df_conc = pd.concat([groupby1, groupby2], axis=0) + + result = df_conc.groupby(level=0).sum() + expected = df.groupby(level=0).sum() + + tm.assert_frame_equal(result, expected)