我有以下情况:
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。然后,您可以将fillna
与forward fill
一起使用来向下传播上层的值,最后您需要删除仍包含NA
的前几行,因为level_0尚未写入。剩下的就是要符合你的预期输出。
编辑:当级别3更改时,使用drop_duplicates以避免结转以前的值