I have the following table
CODE LEV NAME A00 3 text A000 4 text A001 4 text A02 3 text A022 4 text A0220 5 text A33 3 text
For each top level 3, there are sub levels 4,5,6, etc. For some level 3, there are no sub-level. I need to transpose levels and create a meaningful flat file like this using pandas.
L3 L4 L5 NAME A00 - - text A00 A000 - text A00 A001 - text A02 - - text A02 A022 - text A02 A022 A0220 text A33 - - text
Advertisement
Answer
I’ll probably be lynched for this but since there isn’t any better answer – hope that helps :-)
>>> df
CODE LEV NAME
1 A00 3 text
2 A000 4 text
3 A001 4 text
4 A02 3 text
5 A022 4 text
6 A0220 5 text
7 A33 3 text
>>> (df
...: .groupby(['LEV','NAME'])
...: .agg(list)
...: .reset_index()
...: .explode('CODE')
...: .reset_index()
...: .pivot_table(index=['index', 'NAME'],columns='LEV',values='CODE', aggfunc=list)
...: .reset_index()
...: .explode('3')
...: .explode('4')
...: .explode('5')
...: .drop_duplicates()
...: .reset_index()
...: .drop(['level_0','index'], axis=1)
...: .rename({'3': 'L3', '4': 'L4', '5': 'L5'}, axis=1)
...: .rename_axis(None, axis=1)
...: .fillna('-'))[['L3','L4','L5','NAME']]
L3 L4 L5 NAME
0 A00 - - text
1 A02 - - text
2 A33 - - text
3 - A000 - text
4 - A001 - text
5 - A022 - text
6 - - A0220 text