I have a Pandas dataframe in wide format that looks like this:
import pandas as pd
df = pd.DataFrame({'Class_ID': {0: 432, 1: 493, 2: 32},
'f_proba_1': {0: 3, 1: 8, 2: 6},
'f_proba_2': {0: 4, 1: 9, 2: 9},
'f_proba_3': {0: 2, 1: 4, 2: 1},
'p_proba_1': {0: 3, 1: 82, 2: 36},
'p_proba_2': {0: 2, 1: 92, 2: 96},
'p_proba_3': {0: 8, 1: 41, 2: 18},
'Meeting_ID': {0: 27, 1: 23, 2: 21}})
df
Class_ID f_proba_1 f_proba_2 f_proba_3 p_proba_1 p_proba_2 p_proba_3 Meeting_ID
0 432 3 4 2 3 2 8 27
1 493 8 9 4 82 92 41 23
2 32 6 9 1 36 96 18 21
and I would like to convert to long format:
Class_ID Student_ID f_proba p_proba Meeting_ID
0 432 1 3 3 27
1 432 2 4 2 27
2 432 3 2 8 27
3 493 1 8 82 23
4 493 2 9 92 23
5 493 3 4 41 23
6 32 1 6 36 21
7 32 2 9 96 21
8 32 3 1 18 21
So I have tried .melt
in Pandas and here is my code
out = pd.melt(df,
id_vars = ['Class_ID', 'Meeting_ID'],
value_vars = ['f_proba_1','f_proba_2','f_proba_3','p_proba_1','p_proba_2','p_proba_3'],
var_name = 'Student_ID',
value_name = ['f_proba', 'p_proba'])
out
but it didn't work.
You can use pd.wide_to_long
for this:
out = (pd.wide_to_long(df,
stubnames=['f_proba', 'p_proba'],
i=['Class_ID', 'Meeting_ID'],
j='Student_ID',
sep='_')
.reset_index()
)
Output:
Class_ID Meeting_ID Student_ID f_proba p_proba
0 432 27 1 3 3
1 432 27 2 4 2
2 432 27 3 2 8
3 493 23 1 8 82
4 493 23 2 9 92
5 493 23 3 4 41
6 32 21 1 6 36
7 32 21 2 9 96
8 32 21 3 1 18