Python Pandas透视整数DataFrame时出现异常浮点值的问题
我之前处理pandas透视表的时候也踩过类似的坑,咱们一步步拆解问题根源,再给你对应的解决方案:
核心问题根源
先看你写的代码:
dummy=dummy.pivot_table(index=['hour','new_id'],columns='name', values='values').fillna(0)
这里有两个关键问题直接导致了你看到的异常:
默认聚合函数是均值,不是求和!
pandas的pivot_table()默认用mean(均值)作为聚合逻辑,而不是你预期的sum(求和)。如果同一个(hour, new_id, name)组合下有多条记录,计算均值自然会得到浮点数,而且和求和结果偏差极大——比如两条记录值都是5,求和是10,均值是5,这就差了一倍,完全不符合你的预期。fillna(0)强制转换为浮点类型
就算你后来改成求和,fillna(0)里的0是浮点型的0.0,会把原本可能是整数的列强制转成浮点类型。这个只是类型问题,不会导致数值偏差,但会让结果都带上.0。
另外还要排查你的原始数据:有没有可能values列表面是整数,但实际已经是浮点型?比如原始数据里存在NaN,pandas会自动把整数列转为浮点列来容纳缺失值,这种情况下哪怕求和也会得到浮点数(比如sum([5.0, 4.0])结果是9.0)。
针对性解决方法
根据你的需求,只需要做几个小调整就能得到预期的整数结果:
方法1:明确指定求和聚合函数,再转回整数
这是最稳妥的方式,不管有没有重复数据都适用:
dummy = dummy.pivot_table( index=['hour','new_id'], columns='name', values='values', aggfunc='sum' # 关键:告诉pandas用求和,不是默认的均值 ).fillna(0).astype(int) # 把浮点型的0.0转成整数0,去掉多余的小数位
方法2:用pivot代替pivot_table(如果无重复数据)
如果你的原始数据中,每个(hour, new_id, name)组合只有唯一一条记录(不需要聚合),可以直接用pivot(),它不需要指定聚合函数,直接完成重塑:
dummy = dummy.pivot( index=['hour','new_id'], columns='name', values='values' ).fillna(0).astype(int)
额外小提示:先处理原始数据类型
如果原始数据的values列因为存在NaN已经是浮点型,可以先预处理转成整数:
# 先填充缺失值为0,再转成整数类型 dummy['values'] = dummy['values'].fillna(0).astype(int) # 再执行透视操作 dummy = dummy.pivot_table(...)
这样调整后,你就能得到完全符合预期的整数透视结果啦。
内容的提问来源于stack exchange,提问作者sato

