如何使用pandas实现表格转换 解决pivot_table结果不符合预期的问题
Pandas 表格转换问题解决方案
问题原因
你原来的代码有两个核心问题:
- 传入
values=['D']会生成多重列索引,最终列名会是('D', 1)这类格式,不符合单层列名的需求 pivot_table默认使用均值mean作为聚合函数,而你的D列是字符串类型,无法计算均值,导致取值异常
解决方案
方案1:调整pivot_table参数
import pandas as pd df = pd.DataFrame({'A':['a','a','a','a1','a1','a1','a1','a1','a1'], 'B':['b','b','b','b1','b1','b1','b1','b1','b1'], 'C':['c','c','c','c1','c1','c1','c1','c1','c1'], 'D':['d','d1','d2','d3','d4','d5','d6','d7','d8'], 'Rank':[1,2,3,1,2,3,4,5,6]}) # 调整pivot_table参数 res = pd.pivot_table( df, values='D', index=['A','B','C'], columns='Rank', aggfunc='first' # 每个分组+Rank只有一个D值,直接取第一个即可 ).reset_index() # 列名转字符串匹配需求 res.columns = res.columns.astype(str) # 补全Rank=7的列,填充空值 res['7'] = pd.NA # 如果需要将空值显示为字符串'NaN',可取消注释下行 # res = res.fillna('NaN')
方案2:使用更适配的pivot方法
因为你的数据中每个[A,B,C] + Rank组合唯一,不需要聚合操作,直接用pivot方法更简单:
res = df.pivot(index=['A','B','C'], columns='Rank', values='D').reset_index() res.columns = res.columns.astype(str) res['7'] = pd.NA
运行上述代码得到的res就和你期望的输出一致。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

