df.set_index(['label','type'])['value'].unstack()
type   a  b  c
label         
x      1  2  3
y      4  5  6
z      7  8  9
simplifying the passing of pivot arguments
df.pivot(*df)
type   a  b  c
label         
x      1  2  3
y      4  5  6
z      7  8  9
[*df]
#['label', 'type', 'value']
For expected output we need DataFrame.reset_index and DataFrame.rename_axis
df.pivot(*df).rename_axis(columns = None).reset_index()
  label  a  b  c
0     x  1  2  3
1     y  4  5  6
2     z  7  8  9
if there are duplicates in a,b columns we could lose information so we need GroupBy.cumcount
print(df)
  label type  value
0     x    a      1
1     x    b      2
2     x    c      3
3     y    a      4
4     y    b      5
5     y    c      6
6     z    a      7
7     z    b      8
8     z    c      9
0     x    a      1
1     x    b      2
2     x    c      3
3     y    a      4
4     y    b      5
5     y    c      6
6     z    a      7
7     z    b      8
8     z    c      9
df.pivot_table(index = ['label',
                        df.groupby(['label','type']).cumcount()],
               columns = 'type',
               values = 'value')
type     a  b  c
label           
x     0  1  2  3
      1  1  2  3
y     0  4  5  6
      1  4  5  6
z     0  7  8  9
      1  7  8  9
Or:
(df.assign(type_2 = df.groupby(['label','type']).cumcount())
   .set_index(['label','type','type_2'])['value']
   .unstack('type'))