输入:
|Name|L1|L1 Desc|L2|L2 Desc|L3|L3 Desc|L4|L4 Desc|
|Name1|L1|L1 Desc|L2|L2 Desc|L3|L3 Desc|L4|L4 Desc|
|Name2|L1|L1 Desc|L2|L2 Desc|L3|L3 Desc|L4|L4 Desc|
我想得到:
|Name|Levels|Level Desc|
|Name1|L1|L1 Desc|
|Name1|L2|L2 Desc|
|Name1|L3|L3 Desc|
|Name1|L4|L4 Desc|
|Name2|L1|L1 Desc|
|Name2|L2|L2 Desc|
|Name2|L3|L3 Desc|
|Name2|L4|L4 Desc|
等
但是,它还应该根据一些手动输入条件(例如函数参数)进行扩展以适合多个Desc(请参见下面的Kid),例如:
|Name|L1|L1 Desc|L1 Kid|L2|L2 Desc|L2 Kid|L3|L3 Desc|L3 Kid|L4|L4 Desc|L4 Kid|
|Name1|L1|L1 Desc|L1 Kid|L2|L2 Desc|L2 Kid|L3|L3 Desc|L3 Kid|L4|L4 Desc|L4 Kid|
|Name2|L1|L1 Desc|L1 Kid|L2|L2 Desc|L2 Kid|L3|L3 Desc|L3 Kid|L4|L4 Desc|L4 Kid|
使它变成
|Name|Levels|Level Desc|Level Kid|
|Name1|L1|L1 Desc|L1 Kid|
|Name1|L2|L2 Desc|L2 Kid|
|Name1|L3|L3 Desc|L3 Kid|
|Name1|L4|L4 Desc|L4 Kid|
|Name2|L1|L1 Desc|L1 Kid|
|Name2|L2|L2 Desc|L2 Kid|
|Name2|L3|L3 Desc|L3 Kid|
|Name2|L4|L4 Desc|L4 Kid|
等
通常,我会使用pd.melt
来执行此操作,但是在这种情况下,它不能满足我的要求。
我是否有一个熊猫函数来执行此操作,在这里我可以声明要剪切的级别(例如,模数2或模数3或概述要保留的字段以及要归入其中的列字段)
还是我必须通过在自定义函数中递归修改pd.melt
来做到这一点?
注意:我事先不知道列名。我只会知道我必须分割多少个(每2/3/4/5/6 / etc个级别)
谢谢
答案 0 :(得分:1)
首先将仅重复列的前几列转换为索引,然后按模进行分组,将range
和concat
设置为默认列名,最后按第一组为常规解决方案设置列名:>
n = 3
df = df.set_index('Name')
df1 = pd.concat([g.set_axis(range(len(g.columns)), axis=1, inplace=False)
for i, g in df.groupby(np.arange(len(df.columns)) // n , axis=1)], ignore_index=False)
df1.columns = df.columns[:n]
df1 = df1.reset_index()
print (df1)
Name L1 L1 Desc L1 Kid
0 Name1 L1 L1 Desc L1 Kid
1 Name2 L1 L1 Desc L1 Kid
2 Name1 L2 L2 Desc L2 Kid
3 Name2 L2 L2 Desc L2 Kid
4 Name1 L3 L3 Desc L3 Kid
5 Name2 L3 L3 Desc L3 Kid
6 Name1 L4 L4 Desc L4 Kid
7 Name2 L4 L4 Desc L4 Kid