gpt4 book ai didi

python - Pandas 数据框的递归转置

转载 作者:行者123 更新时间:2023-12-01 00:44:31 25 4
gpt4 key购买 nike

输入:

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

等等

但是,它还应该根据某些手动输入标准(如函数参数)进行扩展以适应多个描述(请参见下面的 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函数可以让我做到这一点,我可以在其中说明我希望采取的削减级别(例如模2或模3,或者概述我想要保留的字段以及要落入其中的列字段)或者我必须通过在自定义函数中递归修改 pd.melt 来完成此操作?

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

谢谢

最佳答案

首先将第一列转换为仅重复列的索引,然后按模分组,通过 rangeconcat 设置默认列名称,最后按第一组设置列名称通用解决方案:

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

关于python - Pandas 数据框的递归转置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57090028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com