There are 2 ways to normal results: use agg function grp_df = df.groupby(['BookLevel4','Symbol','Direction','OrderId'], as_index=False).agg({'TxTime':['min','max','count'], 'FillQuantity':['sum']}) grp_df.columns = [''.join(col).strip() for col in grp_df.columns.values] use apply function In case you use more than 1 column Wont have to normalize multi-level columns grp_df = df.groupby(['BookLevel4','Symbol','Direction','OrderId'], as_index=False).apply( lambda s: pd.Series({ "TxTimemin": s["TxTime"].min(), "TxTimemax": s["TxTime"].max(), "TxTimecount": s["TxTime"].count(), "FillQuantitysum": s["FillQuantity"].sum(), "FillVWAP": (s['FillPrice'] * s['FillQuantity']).sum() / s['FillQuantity...