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 shorthandEquivalent
"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()