Use groupby.transform
?
This does the job. This works on large datasets.
import pandas as pd
df = pd.DataFrame({
"group": ["A", "A", "B", "B", "B", "C"],
"value": [10, 14, 3, 4, 9, 20],
})
df["value_centered"] = df["value"] - df.groupby("group")["value"].transform("mean")
print(df)