首页 > 解决方案 > 使用 Pandas 转置和创建平面文件

问题描述

我有下表

CODE    LEV NAME
A00     3   text
A000    4   text
A001    4   text
A02     3   text
A022    4   text
A0220   5   text
A33     3   text

对于每个顶级 3,都有子级别 4、5、6 等。对于某些级别 3,没有子级别。我需要转置关卡并使用 pandas 创建一个像这样有意义的平面文件。

L3    L4    L5    NAME
A00   -     -     text
A00   A000  -     text
A00   A001  -     text
A02   -     -     text
A02   A022  -     text
A02   A022  A0220 text
A33   -     -     text

标签: pythonpandas

解决方案


我可能会因此被处以私刑,但因为没有更好的答案 - 希望有帮助:-)

>>> 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

推荐阅读