pandas
pandas is LINQ + DataTables, rebuilt for the real world. If you know SQL, you already know 70%.
▶ Watch this reelWhat you'll learn
- DataFrame & Series
- Select, filter, sort
- groupby & aggregate
- merge / join
- Missing data & dtypes
- Memory & performance
Remember this
- DataFrame = table, Series = column; boolean masks = WHERE; loc = SELECT…WHERE
- groupby.agg = SQL GROUP BY; merge needs explicit on/how/validate — trust nothing
- isna first, fillna as a documented claim, category dtype + vectorization for scale
DataFrame & Series
- DataFrame = labeled table; Series = one column. Built on NumPy → vectorized.
- First moves:
read_*→.shape/.dtypes/.isna().sum().
Select / filter / sort
| SQL | pandas | |
|---|---|---|
| WHERE | df[df["x"] > 1] (boolean mask; & ` | ` need parens) |
| SELECT cols | df.loc[mask, ["a", "b"]] | |
| ORDER BY … LIMIT | .sort_values("x", ascending=False).head(10) |
groupby & aggregate
df.groupby("k")["v"].mean()·.agg(total=("v","sum"), n=("id","count")).
merge / join
df.merge(other, on="key", how="left", validate="m:1", indicator=True).- Defaults differ from SQL: inner join + shared-column keys → always be explicit.
- Duplicated keys silently multiply rows → validate + row-count checks.
Missing data & dtypes
isna→ know the holes ·fillna= a documented claim ·dropna.pd.to_datetime/pd.to_numeric(errors="coerce")early; codify dtypes in a schema.
Memory & performance
astype("category")for low-cardinality strings (~10x).- Avoid
.apply(f)— vectorize with masks / np.where / merges. - Bigger than RAM:
read_csv(chunksize=…)— or Parquet + DuckDB (next reels).
Code: pandas for the SQL-brained — one realistic pipeline
import pandas as pd
# --- load + orient ------------------------------------------------
df = pd.read_csv("tickets.csv")
print(df.shape, df.dtypes, df.isna().sum(), sep="\n")
# --- clean (documented claims!) ------------------------------------
df["created"] = pd.to_datetime(df["created"], errors="coerce")
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")
df["amount"] = df["amount"].fillna(0) # claim: missing = free ticket
# --- WHERE + ORDER BY ----------------------------------------------
hot = (df[(df["priority"] == "P1") & (df["status"] == "open")]
.sort_values("created"))
# --- GROUP BY (named aggs) -----------------------------------------
summary = (df.groupby(["priority", "status"])
.agg(total=("amount", "sum"),
n=("id", "count"),
avg=("amount", "mean"))
.reset_index())
# --- JOIN (explicit everything) ------------------------------------
agents = pd.read_csv("agents.csv")[["agent_id", "team"]]
report = (df.merge(agents, on="agent_id", how="left", validate="m:1")
.groupby("team")["amount"].sum())
# --- memory trick ----------------------------------------------------
df["status"] = df["status"].astype("category")
report.to_csv("team_report.csv")