如何使用Pandas的Melt/Pivot重塑DataFrame至目标格式?
Pandas宽表转指定长格式并聚合实现方案
模拟样本数据
先还原你可能的宽格式数据场景(若实际数据结构不同,可对应调整):
import pandas as pd # 示例宽表:Regierungsviertel有多条Raub记录,平均值为41.33 df_wide = pd.DataFrame({ 'Region': ['Regierungsviertel', 'Regierungsviertel', 'Regierungsviertel', 'Mitte', 'Pankow'], 'Raub': [40, 42, 42, 35, 38], 'Diebstahl': [120, 130, 115, 100, 95], 'Brand': [5, 7, 6, 4, 3] })
两种可行实现方式
方式1:先聚合宽表,再转长格式
先对同区域的同类型犯罪做聚合(这里用平均值得到41.33),再用melt重塑:
# 按Region分组,计算各犯罪类型的均值 aggregated = df_wide.groupby('Region').mean().reset_index() # 重塑为目标长格式 result = pd.melt( aggregated, id_vars='Region', var_name='Crimes', value_name='count' ) # 保留两位小数确保数值显示为41.33 result['count'] = result['count'].round(2)
方式2:先转长格式,再聚合
先把宽表拆成每条记录对应一个区域-犯罪类型的结构,再分组聚合:
# 先转长格式 melted = pd.melt( df_wide, id_vars='Region', var_name='Crimes', value_name='count' ) # 按Region和Crimes分组计算均值 result = melted.groupby(['Region', 'Crimes'])['count'].mean().reset_index() result['count'] = result['count'].round(2)
关键说明
- 若
41.33不是平均值,而是其他统计量(如总和、加权平均),替换mean()为对应函数即可 melt的参数要对应:id_vars指定要保留的分组列(Region),var_name是原宽表列名要转成的新列名(Crimes),value_name是数值列的名称(count)- 最终结果中,Regierungsviertel的Raub值会精确显示为41.33
内容的提问来源于stack exchange,提问作者0004
相关产品推荐
相关产品推荐

