如何在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
相关产品推荐
相关产品推荐

