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

如何在Python中基于指定列拆分表格?透视表尝试无效

问题描述

我有一个名为df1的DataFrame,数据如下:

ID       M1  M2   NO        DTime         Result (P2-P3) (P1-P2) (P1-P7) (P3-P7) 
2801596 288 371  536529 08-02-2023 11:07    1    NaN    0.085    NaN      NaN
2801596 289 371  536529 08-02-2023 11:07    1     1     0.032   1.081     NaN
2801584 290 372  541278 08-02-2023 11:10    1    NaN    0.081    NaN      NaN
2801584 291 372  541278 08-02-2023 11:10    0     1     0.037   1.065     NaN
2801598 288 371  541279 08-02-2023 11:12    1    NaN    0.076    NaN      NaN
2801599 288 371  555623 08-02-2023 11:14    1     1      NaN     NaN     3.871
2801599 289 371  555623 08-02-2023 11:14    1     1      NaN     NaN     2.389
2801600 291 372  555624 08-02-2023 11:18    1    NaN    0.0835   NaN      NaN

尝试用透视表处理时得到全NaN的结果,代码如下:

df2 = pd.pivot_table(df1, values=['Result','(P2-P3)','(P1-P2)','(P1-P7)','(P3-P7)'], index=['ID','NO','DTime'],columns=['M2','M1'], aggfunc='first')

希望得到正确格式的输出表格。

解决方案

导致透视表全为NaN的核心原因大概率是列名不匹配——原始数据的列名可能包含多余的前后空格,导致values参数指定的列名无法匹配到DataFrame中的实际列。

步骤1:清理列名

先去除所有列名的前后空白字符,确保列名完全匹配:

# 清理列名中的前后空格
df1.columns = df1.columns.str.strip()

步骤2:重新生成透视表

使用清理后的列名重新运行透视表代码:

df2 = pd.pivot_table(
    df1,
    values=['Result', '(P2-P3)', '(P1-P2)', '(P1-P7)', '(P3-P7)'],
    index=['ID', 'NO', 'DTime'],
    columns=['M2', 'M1'],
    aggfunc='first'
)

额外处理:重复行问题

如果清理列名后仍有NaN,可检查是否存在(ID, NO, DTime, M2, M1)的重复组合。若存在,可先去重再生成透视表:

# 保留每组重复行的第一条记录
df1_clean = df1.drop_duplicates(subset=['ID', 'NO', 'DTime', 'M2', 'M1'], keep='first')

# 基于去重后的数据生成透视表
df2 = pd.pivot_table(
    df1_clean,
    values=['Result', '(P2-P3)', '(P1-P2)', '(P1-P7)', '(P3-P7)'],
    index=['ID', 'NO', 'DTime'],
    columns=['M2', 'M1'],
    aggfunc='first'
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:52:26