pandas Cheatsheet
Grouping
Use this pandas reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.
Basic groupby
g = df.groupby("col") # group by one column g = df.groupby(["col1", "col2"]) # group by multiple columns g = df.groupby("col", sort=False) # preserve insertion order g = df.groupby("col", dropna=False) # include NaN as a group key g = df.groupby("col", observed=True) # for Categorical: skip unused categories # Access a single group df.groupby("city").get_group("NYC")
Aggregation on Groups
# Single function df.groupby("dept")["salary"].mean() df.groupby("dept")["salary"].sum() df.groupby("dept").sum() # sum all numeric cols # Multiple functions — .agg() df.groupby("dept")["salary"].agg(["mean", "min", "max", "count"]) # Named aggregations (pandas ≥ 0.25) df.groupby("dept").agg( avg_salary=("salary", "mean"), max_salary=("salary", "max"), headcount=("id", "count"), ) # Different aggregation per column df.groupby("dept").agg({"salary": "mean", "age": "max", "name": "count"})
Common Aggregation Functions
| String shorthand | Equivalent |
|---|---|
"sum" | np.sum |
"mean" | np.mean |
"median" | np.median |
"min" / "max" | np.min / np.max |
"count" | non-null count |
"size" | total count incl. NaN |
"std" / "var" | sample std / variance |
"first" / "last" | first / last value in group |
"nunique" | number of unique values |
"prod" | product |
"sem" | standard error of the mean |
.transform() — Broadcast Group Result Back to Original Index
# Group mean broadcast to original shape (for normalization) df["mean_salary"] = df.groupby("dept")["salary"].transform("mean") # Z-score within group df["z"] = df.groupby("dept")["salary"].transform( lambda g: (g - g.mean()) / g.std() ) # Rank within group df["rank"] = df.groupby("dept")["salary"].transform("rank", ascending=False)
.filter() — Keep or Drop Entire Groups
# Keep groups where condition on the group DataFrame is True df.groupby("dept").filter(lambda g: len(g) >= 5) df.groupby("dept").filter(lambda g: g["salary"].mean() > 70_000) df.groupby("dept").filter(lambda g: g["score"].max() > 90)
.apply() — Arbitrary Group Function
# Function receives a sub-DataFrame per group df.groupby("dept").apply(lambda g: g.nlargest(3, "salary")) # Return a scalar → becomes a Series df.groupby("dept")["salary"].apply(lambda g: g.quantile(0.9)) # Control index behavior df.groupby("dept", group_keys=False).apply(lambda g: g.sort_values("salary"))
.apply()is flexible but slow. Prefer.agg()/.transform()when possible.
GroupBy on Multiple Columns
g = df.groupby(["year", "dept"]) g["salary"].mean() # Series with MultiIndex # Reset index to flatten MultiIndex result g["salary"].mean().reset_index()
Size and Count
df.groupby("dept").size() # count incl. NaN (returns Series) df.groupby("dept")["salary"].count() # count non-null df.groupby("dept").count() # non-null count per column
Value Counts
# Frequency table for a column (not a GroupBy, but often paired) df["dept"].value_counts() df["dept"].value_counts(normalize=True) # proportions df["dept"].value_counts(dropna=False) # include NaN # GroupBy value counts (pandas ≥ 1.1) df.groupby("dept")["level"].value_counts() df.groupby("dept")["level"].value_counts(normalize=True)
Cumulative and Window Functions on Groups
df.groupby("dept")["salary"].cumsum() df.groupby("dept")["salary"].cumprod() df.groupby("dept")["salary"].cummax() df.groupby("dept")["salary"].cummin() # Rolling window within group df.groupby("dept")["sales"].transform(lambda g: g.rolling(3).mean())
Resample (Time-Series GroupBy)
# DatetimeIndex required df.resample("ME")["sales"].sum() # monthly sum (ME = month end) df.resample("QE")["sales"].mean() # quarterly mean df.resample("YE").agg({"sales": "sum", "cost": "mean"}) df.resample("W-MON")["val"].last() # weekly, week ending Monday # Offset aliases: "D" daily, "h" hourly, "min" minute, "s" second # "W" weekly, "ME" month end, "MS" month start, "QE" quarter end, "YE" year end
Groupby with as_index=False
# Returns a DataFrame with group keys as regular columns (like SQL GROUP BY) df.groupby("dept", as_index=False)["salary"].mean() # Equivalent to: df.groupby("dept")["salary"].mean().reset_index()
Iteration Over Groups
for name, group_df in df.groupby("dept"): print(name, len(group_df)) # Multiple keys → name is a tuple for (year, dept), group_df in df.groupby(["year", "dept"]): print(year, dept, group_df.shape) # Dict of groups groups = dict(df.groupby("dept")) groups["Engineering"]
pd.Grouper — Advanced Grouping Keys
# Group by time frequency + another column together df.groupby([pd.Grouper(freq="ME"), "region"])["sales"].sum() # Group by year from a non-index date column df.groupby(pd.Grouper(key="date", freq="YE"))["revenue"].sum()