df = pd.DataFrame({"name": list("ABABCD"), "value": np.arange(6)}) maxes = df.groupby(["name"]).agg("max") df["maxvalue"]=df["name"].apply(lambda x: maxes.loc[x]) name value maxvalue 0 A 0 2 1 B 1 3 2 A 2 2 3 B 3 3 4 C 4 4 5 D 5 5

For 2 columns, I've tried this but it doesn't work:

import numpy as np
import pandas as pd
df = pd.DataFrame({"name": list("ABABCD"),"name2": list("MNOMNO"), "value": np.arange(6)})
maxes = df.groupby(["name","name2"]).agg("max")
df["maxvalue"]=df[["name","name2"]].apply(lambda x: maxes.loc[x])