Say I have this data frame:
import pandas as pd
x = pd.DataFrame([[1, 'step', 'id', 22, 33],
[2, 'step', 'id', 55, 66]],
columns=['time', 'head_1', 'head_2', 'value_1', 'value_2'])
print(x)
time head_1 head_2 value_1 value_2
0 1 step id 22 33
1 2 step id 55 66
Then I use pivot table like below
print(x.pivot_table(values=['value_1', 'value_2'], columns='time', index=['head_1', 'head_2']))
value_1 value_2
time 1 2 1 2
head_1 head_2
step id 22 55 33 66
However, I really want to have value_1 and value_2 in rows instead of columns like below (a new header as head_3). That is, put value_1 and value_2 in rows and only time as column. How do I do that?
time 1 2
head_1 head_2 head_3
step id value_1 22 55
step id value_2 33 66
One straightforward way is to melt your dataframe so value_1
and value_2 become labels in single column and then pivot on that. Like:
import pandas as pd
x = pd.DataFrame(
[
[1, 'step', 'id', 22, 33],
[2, 'step', 'id', 55, 66]
],
columns=['time','head_1', 'head_2', 'value_1', 'value_2']
)
melted = x.melt(
id_vars=['time','head_1', 'head_2'],
value_vars=['value_1','value_2'],
var_name='head_3',
value_name='val'
)
result = melted.pivot_table(
index=['head_1','head_2','head_3'],
columns='time',
values='val',
aggfunc='first'
)
You’ll get:
time 1 2
head_1 head_2 head_3
step id value_1 22 55
value_2 33 66
This places value_1
and `value_2 in rows as you wanted with only time going across columns