如何在Pandas中实现评分转列、原有列转行的结构转换
Pandas 表结构转换实现:评分维度转列、原有指标转行
示例原始数据

目标输出格式

实现方法
你可以通过melt+字段拆分+pivot的组合实现,也可以直接用Pandas内置的wide_to_long函数快速完成转换,两种方法代码如下:
方法1:通用分步写法(兼容复杂字段场景)
先构造和示例结构一致的测试数据方便你复现:
import pandas as pd # 构造原始示例数据 df = pd.DataFrame({ 'ID': [1, 2, 3], '名称': ['商品A', '商品B', '商品C'], '1星_打分人数': [10, 5, 2], '2星_打分人数': [20, 15, 8], '3星_打分人数': [30, 25, 12], '4星_打分人数': [25, 30, 20], '5星_打分人数': [15, 25, 58] })
转换代码:
# 1. 保留ID、名称为固定维度,把所有星级相关列转为行存储 df_long = df.melt(id_vars=['ID', '名称'], var_name='temp_col', value_name='value') # 2. 把合并的字段拆分为星级、统计项两个独立字段 df_long[['星级', '统计项']] = df_long['temp_col'].str.split('_', expand=True) # 3. 把星级维度转为列,整理得到最终结果 df_result = df_long.pivot(index=['ID', '名称', '统计项'], columns='星级', values='value').reset_index() # 清理冗余索引名、调整列顺序 df_result.columns.name = None df_result = df_result[['ID', '名称', '统计项', '1星', '2星', '3星', '4星', '5星']]
方法2:简便写法(wide_to_long一步转换)
如果你的字段命名统一为[星级]_[统计项]的格式,可以直接用内置函数简化代码:
df_result = pd.wide_to_long( df, stubnames=['1星', '2星', '3星', '4星', '5星'], # 要提取为列的星级前缀 i=['ID', '名称'], # 固定保留的行维度 j='统计项', # 拆分后作为行的字段名 sep='_', # 字段名分隔符 suffix='\w+' # 匹配分隔符后的统计项内容 ).reset_index() # 调整列顺序和目标格式对齐 df_result = df_result[['ID', '名称', '统计项', '1星', '2星', '3星', '4星', '5星']]
两种方法输出结果完全一致,如果后续新增「X星_平均分」「X星_占比」等其他同命名规则的字段,代码不需要额外修改,会自动把新的统计项拆分为独立行。
内容的提问来源于stack exchange,提问作者D_S
相关产品推荐
相关产品推荐

