繁体   English   中英

Pandas 数据帧的递归转置

[英]Recursive Transpose of Pandas Dataframe

输入:

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

等等

但是,它也应该根据一些手动输入标准(如函数参数)扩展以适应多个 Descs(参见下面的 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来做到这一点,但在这种情况下,它不能满足我的要求。

是否有 Pandas 功能可以让我执行此操作,我可以在其中说明我希望采用的切割级别(例如,Modulo 2 或 Modulo 3,或者概述我想要保留的字段和要落入其中的列字段)或者我必须通过在自定义函数中递归修改pd.melt来做到这一点吗?

注意:我事先不知道列名。 我只会知道我必须分割多少(每 2/3/4/5/6/etc 级别)

谢谢

首先将第一列转换为仅重复列的索引,然后按模分组,按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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM