groupby
df.groupby(['name', 'vals']).size().unstack(fill_value=0)
vals Q X Y Z
name
bar 1 0 1 1
foo 0 1 1 1vals Q
pd.factorize
и назначение среза
Это назначит один для существования, но не подсчитает общее вхождение
i, r = pd.factorize(df.name)
j, c = pd.factorize(df.vals)
b = np.zeros((r.size, c.size), int)
b[i, j] = 1
pd.DataFrame(b, r, c)
X Y Z Q
foo 1 1 1 0
bar 0 1 1 1
pd.factorize
и np.bincount
i, r = pd.factorize(df.name)
j, c = pd.factorize(df.vals)
n, m = len(r), len(c)
b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)
pd.DataFrame(b, r, c)
X Y Z Q
foo 1 1 1 0
bar 0 1 1 1