Pandas如何将DataFrame宽表转换为指定格式的目标长表
解决方案
你当前写的melt逻辑已经完成了宽表转长表的第一步,之所以没有得到目标格式,是因为没有把type_sale字段的两个枚举值(open/closed)展开为独立列,在现有代码基础上追加pivot转换即可,完整代码如下:
import pandas as pd import numpy as np pd.set_option('max_columns', None) data = { 'type_sale': ['open','closed'], 'group_1': [20,10], 'group_2': [20,10], 'group_3': [20,10], 'group_4': [20,10], 'group_5': [20,10], 'group_6': [20,10], 'group_7': [20,10], 'group_8': [20,10], 'group_9': [20,10], 'group_10': [20,10], } df = pd.DataFrame(data, columns = ['type_sale', 'group_1', 'group_2', 'group_3', 'group_4', 'group_5', 'group_6', 'group_7', 'group_8', 'group_9', 'group_10', ]) # 核心转换逻辑 df1 = df.melt(id_vars=["type_sale"], var_name="groups") \ .pivot(index="groups", columns="type_sale", values="value") \ .reset_index() \ .rename_axis(columns=None) # 如需调整open、closed列的顺序,可追加以下代码 # df1 = df1[["groups", "open", "closed"]]
代码说明
melt步骤和你原有逻辑一致,会生成包含type_sale、groups、value三列的长表,每个分组对应2行数据(分别对应当前open、closed的销售类型值)pivot步骤将行维度的type_sale值旋转为列维度,以groups作为行索引,匹配对应的value值reset_index()将作为索引的groups字段还原为普通数据列rename_axis(columns=None)用于清除列索引的多余名称,避免出现无意义的表头层级
转换后输出的表结构前3行示例:
| groups | closed | open |
|---|---|---|
| group_1 | 10 | 20 |
| group_2 | 10 | 20 |
| group_3 | 10 | 20 |
内容的提问来源于stack exchange,提问作者silent_hunter
相关产品推荐
相关产品推荐

