如何在Python中透视DataFrame并实现表格扁平化(解决重复列问题)
数据集扁平化(类独热编码)实现方案
原始数据集
StID SubClassID PhOrder PhAmt LbOrder LbAmt 4326 200572288 Anti1 23.3 Asprin 13.7 4326 200572288 Anti2 39.3 Morphin 2.2 4326 200572288 NULL NULL Medine 30.5 4326 200572288 Anti3 13.5 Kabomin 20.3 4326 200572288 NULL NULL Zorifin 0.2 0993 200348299 Anti1 8.4 Zorifin 9.7 0993 200348299 Anti2 10.9 Zorifin 95.6 0993 200348299 Anti4 48.9 NULL NULL
目标格式
StID SubClassID Anti1 Anti2 Anti3 Anti4 Asprin Morphin Medine Kabomin Zorifin 4326 200572288 23.3 39.3 13.5 NULL 13.7 2.2 30.5 20.3 0.2 0993 200348299 8.4 10.9 NULL 48.9 NULL NULL NULL NULL 52.65
问题分析
你当前的pivot_table写法生成了多层嵌套列(同时以PhOrder/LbOrder和PhAmt/LbAmt作为列层级),导致列结构混乱,且未处理LbOrder重复时的数值聚合需求(如0993的Zorifin需要取平均值)。
正确实现代码
import pandas as pd data = { 'StId': [4326, 4326, 4326, 4326, 4326, 993, 993, 993], 'SubClassID': [200572288, 200572288, 200572288, 200572288, 200572288, 200348299, 200348299, 200348299], 'PhOrder': ['Anti1', 'Anti2', 'NULL', 'Anti3', 'NULL', 'Anti1', 'Anti2', 'Anti4'], 'PhAmt': [23.3, 39.3, None, 13.5, None, 8.4, 10.9, 48.9], 'LbOrder': ['Asprin', 'Morphin', 'Medine', 'Kabomin', 'Zorifin', 'Zorifin', 'Zorifin', None], 'LbAmt': [13.7, 2.2, 30.5, 20.3, 0.2, 9.7, 95.6, None] } df = pd.DataFrame(data) # 处理PhOrder列:过滤NULL值,转宽表 ph_df = df[df['PhOrder'] != 'NULL'].pivot( index=['StId', 'SubClassID'], columns='PhOrder', values='PhAmt' ).reset_index() # 处理LbOrder列:过滤NULL值,重复项取平均值,转宽表 lb_df = df[df['LbOrder'].notna()].pivot_table( index=['StId', 'SubClassID'], columns='LbOrder', values='LbAmt', aggfunc='mean' ).reset_index() # 合并两个结果,得到最终扁平化表格 final_df = pd.merge(ph_df, lb_df, on=['StId', 'SubClassID'], how='outer') # 移除列名的层级标识 final_df.columns.name = None print(final_df)
代码说明
- PhOrder处理:过滤掉
PhOrder为NULL的行,通过pivot转宽表,每个分组内PhOrder唯一,直接取对应PhAmt值。 - LbOrder处理:过滤掉
LbOrder为空的行,用pivot_table配合aggfunc='mean',对同一分组下重复的LbOrder计算平均值(如0993的Zorifin两个值取平均得到52.65)。 - 合并结果:按
StId和SubClassID合并两个宽表,保留所有分组数据。
内容的提问来源于stack exchange,提问作者asmgx
相关产品推荐
相关产品推荐

