将"唯一层次结构"列拆分为更多列



我有以下情况:

COD Level
UF  11
ME  1101
MI  11001
MU  1100452
MU  1100700
MI  11002
MU  1100080
MU  1100106
MU  1101492
ME  1102
MI  11003
MU  1100403
MU  1100023
UF  12
ME  1201
MI  12001
MU  1100122
.... (7000 rows)

-----------解释

UF - 2 digits (higher level)
ME - 4 digits (level 2)
MI - 5 digits (level 1)
MU - 7 digits (level 0)

我试图重新组织这个结构,以便按列分隔每个级别:

预期输出:

COD Level_0  Level_1  Level_2  Level_3  
MU  1100452    11001     1101    11
MU  1100700    11001     1101    11    
MU  1100080    11002     1101    11
MU  1100106    11002     1101    11
MU  1101492    11002     1101    11
MU  1100403    11003     1102    11
MU  1100023    11003     1102    11
MU  1100122    12001     1201    12

因此,每个级别都是相同的,直到出现具有相同级别的另一行。

类似的东西?

In [48]: pd.pivot(df, columns='COD', values='Level').fillna(method='ffill').drop_duplicates('MU').dropna().astype(int).rename(columns={'UF': 'level_3', 'ME': 'level_2', 'MI': 'level_1', 'MU': 'level_0'})
...:                                                                                                                                                                                                   
Out[48]: 
COD  level_2  level_1  level_0  level_3
3       1101    11001  1100452       11
4       1101    11001  1100700       11
6       1101    11002  1100080       11
7       1101    11002  1100106       11
8       1101    11002  1101492       11
11      1102    11003  1100403       11
12      1102    11003  1100023       11
16      1201    12001  1100122       12

pd.pivot为"COD"中的每个值创建一个单独的列。在这一点上,所有其他列都是NA。然后,您可以将fillnaforward fill一起使用来向下传播上层的值,最后您需要删除仍包含NA的前几行,因为level_0尚未写入。剩下的就是要符合你的预期输出。

编辑:当级别3更改时,使用drop_duplicates以避免结转以前的值

最新更新