pandas透视表数值舍入与SciPy stats.mode输出格式简化方法
透视表聚合输出格式优化实现
前置修正:原参考代码的导入语法问题
原代码的导入语句存在语法冲突,正确的基础导入为:
import numpy as np import pandas as pd from scipy import stats
长小数调整为1位小数展示的实现
两类方案按需选择:
仅优化显示效果,不改动底层真实数据
通过pandas浮点展示精度设置实现,不会修改聚合后的实际数值,适配需要保留原始精度、仅优化打印观感的场景:
临时生效写法(不干扰全局pandas配置):with pd.option_context('display.float_format', lambda x: '%.1f' % x): # 透视表生成及打印逻辑放在上下文内执行 print(pivot_result)全局生效写法:在代码全局区域添加
pd.set_option('display.float_format', lambda x: '%.1f' % x),后续所有浮点型输出都会自动应用1位小数的展示规则。直接修改聚合结果的数值精度
如果需要将聚合值转换为保留1位小数的真实数值(比如后续要基于透视表结果做二次计算),在透视表生成完成后直接调用round方法即可:pivot_result = pivot_result.round(1)
众数纯数值提取实现
由于stats.mode默认返回结构为(存储众数的数组, 存储对应出现次数的数组),会直接在透视表中展示嵌套元组,需要自定义包装函数提取纯众数值:
def get_clean_mode(series): # 处理空值场景,避免计算异常 valid_series = series.dropna() if valid_series.empty: return np.nan # 从返回结构中提取纯众数值 return stats.mode(valid_series)[0][0]
小提示:如果使用scipy 1.11及以上版本,可在调用stats.mode时添加
keepdims=False参数,返回的众数会直接是标量,无需手动取数组索引。
将自定义函数替换原aggfunc参数中的stats.mode,完整的透视表生成代码为:
pivot_result = pd.pivot_table( df_inspections_violations, index=['ACTIVITY YEAR', 'FACILITY ZIP'], values="SCORE", aggfunc=['mean', 'median', get_clean_mode] )
内容的提问来源于stack exchange,提问作者MichaelChoudhury
相关产品推荐
相关产品推荐

