pivot is the opposite of melt: it turns long data wide, with one row per index value and one column per columns value.
targets.pivot(index="region", columns="month", values="target")
pivot only moves values; it doesn't add them up. So every pair of index and column values must appear exactly once. If two rows share a pair (two North orders through the Online channel), pivot stops with Index contains duplicate entries, can't reshape. That's the moment to use pivot_table, which combines duplicates with aggfunc.
Check uniqueness first with duplicated(subset=[...]).any(). After pivoting, reset_index() turns the row labels back into a column, and sum(axis=1) adds across a row.