The source data frame has a column with weightor values yield. We want them to be column names (aka "column level values").
set_index .
unstack .
, :
fruits = \
[('apples' , 2014, 'weight', 1.4),
('apples' , 2015, 'weight', 1.5),
('bananas', 2014, 'yield', 0.5),
('bananas', 2015, 'yield', 0.6),
('bananas', 2014, 'weight', 1.4)]
df = pd.DataFrame(fruits, columns='fruit year col val'.split())
df = df.set_index(['fruit', 'year', 'col'])
df = df.unstack(level='col')
df.columns = df.columns.droplevel(0)
col weight yield
fruit year
apples 2014 1.4 NaN
2015 1.5 NaN
bananas 2014 1.4 0.5
2015 NaN 0.6
- pivot_table:
df = df.pivot_table(index=['fruit', 'year'], columns='col')
df.columns = df.columns.droplevel(0)