如何基于列配置数据:将pivot_table输出改为显示原始data值而非计数
问题与解决方法
原始数据
data={'x':[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,0,0,0,0],'y':[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1], 'subx':[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3],'suby':[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3], 'data':[10,20,10,10,11,13,13,15,12,13,14,12,14,12,12,13,11,20,14,47]}
原代码与当前输出
原代码:
df=pd.DataFrame(data) table=pd.pivot_table(data=df,index=['y','suby'],columns=['x','subx'],values=['data'],aggfunc='count')
当前输出:
data ... x 0 1 ... 2 3 subx 0 1 2 3 0 1 2 ... 1 2 3 0 1 2 3 y suby ... 0 0 1.0 NaN NaN NaN 1.0 NaN NaN ... NaN NaN NaN 1.0 NaN NaN NaN 1 NaN 1.0 NaN NaN NaN 1.0 NaN ... 1.0 NaN NaN NaN 1.0 NaN NaN 2 NaN NaN 1.0 NaN NaN NaN 1.0 ... NaN 1.0 NaN NaN NaN 1.0 NaN 3 NaN NaN NaN 1.0 NaN NaN NaN ... NaN NaN 1.0 NaN NaN NaN 1.0 1 0 1.0 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 1 NaN 1.0 NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 2 NaN NaN 1.0 NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN 1.0 NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN
需求
将输出中显示1.0的位置替换为原始data列的对应数值,空位置保留NaN,期望输出如下:
x 0 1 ... subx 0 1 2 3 0 1 2 ... y suby ... 0 0 10 NaN NaN NaN 11 NaN NaN ... 1 NaN 20 NaN NaN NaN 13 NaN ... 2 NaN NaN 10 NaN NaN NaN 13 ... 3 NaN NaN NaN 10 NaN NaN NaN ... 1 0 11 NaN NaN NaN NaN NaN NaN ... 1 NaN 20 NaN NaN NaN NaN NaN ... 2 NaN NaN 14 NaN NaN NaN NaN ... 3 NaN NaN NaN 47 NaN NaN NaN ...
解决方案
问题出在aggfunc='count',该函数统计分组内非空值的数量,因此得到1.0。由于你的分组(y,suby,x,subx)每组仅对应一个data值,只需改用取单值的聚合函数即可:
方法1:修改pivot_table的聚合函数
df = pd.DataFrame(data) table = pd.pivot_table(data=df, index=['y','suby'], columns=['x','subx'], values=['data'], aggfunc='first')
方法2:直接使用pivot函数
因为你的行列组合是唯一的,pivot函数更适合这种场景,无需指定聚合函数:
table = df.pivot(index=['y','suby'], columns=['x','subx'], values='data')
两种方法都能得到期望的输出,对应位置显示原始data数值,空位置为NaN。
内容的提问来源于stack exchange,提问作者raja
相关产品推荐
相关产品推荐

