I think first is necessary convert columns to lists, because if not working explode
there are strings:
import ast
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(ast.literal_eval)
Or if possible some None
s is possible use:
import json
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(json.loads)
If some data are broken is possible use:
def custom_conv(x):
try:
return ast.literal_eval(x)
except:
return []
import ast
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(custom_conv)
EDIT:
For me working nice in pandas 1.2.3:
a = ['[6.6, 5.2, 4.8, 3.1, 2.9]', '[6.6, 5.2, 4.8, 3.1, 2.9]', '[6.6, 2.2, 4.8, 3.1, 2.9]', '[33.7, 35.0, 31.9, 25.2, 25.9]', '[33.7, 35.0, 31.9, 25.2, 25.9]']
b = ["['acc1', 'acc2', 'acc3', 'acc4', 'acc5']", "['acc1', 'acc2', 'acc3', 'acc4', 'acc5']", "['acc1', 'acc2', 'acc3', 'acc4', 'acc5']", "['acc10', 'acc11', 'acc14', 'acc5', 'acc6']", "['acc10', 'acc11', 'acc14', 'acc5', 'acc6']"]
df = pd.DataFrame({'Year':[2001,2001,2005, 2006, 2007],
'Acc':a,
'Grade':b})
print (df)
Year Acc \
0 2001 [6.6, 5.2, 4.8, 3.1, 2.9]
1 2001 [6.6, 5.2, 4.8, 3.1, 2.9]
2 2005 [6.6, 2.2, 4.8, 3.1, 2.9]
3 2006 [33.7, 35.0, 31.9, 25.2, 25.9]
4 2007 [33.7, 35.0, 31.9, 25.2, 25.9]
Grade
0 ['acc1', 'acc2', 'acc3', 'acc4', 'acc5']
1 ['acc1', 'acc2', 'acc3', 'acc4', 'acc5']
2 ['acc1', 'acc2', 'acc3', 'acc4', 'acc5']
3 ['acc10', 'acc11', 'acc14', 'acc5', 'acc6']
4 ['acc10', 'acc11', 'acc14', 'acc5', 'acc6']
import ast
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(ast.literal_eval)
df = df.apply(pd.Series.explode)
print (df.head(10))
Year Acc Grade
0 2001 6.6 acc1
0 2001 5.2 acc2
0 2001 4.8 acc3
0 2001 3.1 acc4
0 2001 2.9 acc5
1 2001 6.6 acc1
1 2001 5.2 acc2
1 2001 4.8 acc3
1 2001 3.1 acc4
1 2001 2.9 acc5