You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

代码说明

  1. PhOrder处理:过滤掉PhOrder为NULL的行,通过pivot转宽表,每个分组内PhOrder唯一,直接取对应PhAmt值。
  2. LbOrder处理:过滤掉LbOrder为空的行,用pivot_table配合aggfunc='mean',对同一分组下重复的LbOrder计算平均值(如0993的Zorifin两个值取平均得到52.65)。
  3. 合并结果:按StId和SubClassID合并两个宽表,保留所有分组数据。

内容的提问来源于stack exchange,提问作者asmgx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:52:45