My goal is to aggregate a `DataFrame` with several million rows including `Decimal('...')` columns without any precision loss. My current implementation works - but might there be more efficient ways to get the job done? **Original DataFrame** (sample) | game | position | amount | |------|----------|----------------------| | 1 | a | 0.264825920790318533 | | 1 | a | 0.136255564496617048 | | 1 | a | 0.708422792050782986 | | 1 | b | 0.102495961805507297 | | 2 | a | 0.154110321496056788 | | 2 | b | 0.281335658017562252 | **Aggregated DataFrame** (sample) | game | amount_a | amount_b | |------|----------------------|----------------------| | 1 | 1.109504277337718567 | 0.102495961805507297 | | 2 | 0.154110321496056788 | 0.281335658017562252 | **My current approach** import pandas as pd import numpy as np from decimal import Decimal from uuid import uuid4 # generating some sample DataFrame df = pd.DataFrame( data={ "game": [1, 1, 1, 1, 2, 2], "position": ["a", "a", "a", "b", "a", "b"], "amount": [ Decimal(f"{uuid4().int}"[:18]) * (Decimal(10) ** -18) for _ in range(6) ], } ) # aggregating... agg_df = df.groupby(["game", "position"], as_index=False).agg( { "amount": "sum", } ) agg_df["amount_a"] = np.where(agg_df["position"] == "a", agg_df["amount"], 0) agg_df["amount_b"] = np.where(agg_df["position"] == "b", agg_df["amount"], 0) agg_df.drop(["amount", "position"], axis=1, inplace=True) agg_df = agg_df.groupby(["game"], as_index=False).agg( { "amount_a": "sum", "amount_b": "sum", } ) As far as I understand Python and Pandas, the biggest slowdown of my approach comes from the `Decimal('...')` columns in combination with `sum`. Since I need the precision of `10 ** -18` using the decimal package is my only option, right? Is there a way in pandas to do the aggregation in fewer steps?