我有以下情况:
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”中的每个值创建一个单独的列。此时所有其他列都是不适用的。然后,您可以使用 fillna
和 forward fill
来向下传播上层的值,最后您需要删除仍包含 NA
的前几行> 因为 level_0 尚未写入。
剩下的就是符合你的预期输出。
编辑:使用 drop_duplicates 以避免在 level_3 更改时保留之前的值
关于python - 将唯一分层列拆分为更多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63134619/