python - Pandas 数据帧的递归转置
问题描述
输入:
|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|
ETC
但是,它也应该根据一些手动输入标准(如函数参数)扩展以适应多个 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|
ETC
通常我pd.melt
会这样做,但在这种情况下,它不能满足我的要求。
是否有 Pandas 函数可以执行此操作,我可以在其中说明我希望采取的削减水平(例如,模 2 或模 3 或概述我想要保留的字段和列字段)或者我是否必须通过pd.melt
在自定义函数中递归修改来做到这一点?
注意:我事先不知道列名。我只会知道我必须拆分多少(每 2/3/4/5/6/等级别)
谢谢
解决方案
首先将第一列转换为仅重复列的索引,然后按模数分组,按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
推荐阅读
- javascript - 如何设置RequiredLevel 特定控件或属性?
- database - PostgreSQL中的Oracle“替换”函数替代有2个参数?
- java - 如何使用 JobScheduler 显示 toast 消息
- javascript - 多个按钮关闭在reactjs中不起作用
- mysql - Mysql命令to.return 0 if date is not found
- laravel - Laravel Socialite - SocialiteProvider Microsoft Graph 和 Microsoft Azure 之间的区别
- python - 如何在播放视频时通过 PyQt 从眼动仪中绘制眼动数据
- strapi - STRAPI 正在剪切最后 3 个字符
- jquery - Laraver 数据库查询
- ajax - Ajax 自动完成功能在 Laravel 6 中无法正常工作