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