如何为Pandas自定义扩展describe函数,集成SciPy外部统计指标?
自定义Pandas describex函数集成SciPy统计指标的实现方法
先导入scipy.stats模块,然后把需要的统计指标用SciPy函数计算后整理成DataFrame,再和原统计结果合并即可。下面是修改后的完整代码,包含你要的所有统计量:
import pandas as pd from scipy.stats import gmean, hmean, gstd def describex(data, weights=None): # 统一转成DataFrame处理 data = pd.DataFrame(data) # 保留原describe的基础统计结果 stats = data.describe() # 添加Pandas自带的偏度、峰度 skewness = pd.DataFrame({'skewness': data.skew()}).T kurtosis = pd.DataFrame({'kurtosis': data.kurtosis()}).T # 计算几何均值:过滤非正数,避免计算报错 geom_mean = pd.DataFrame({'geometric mean': gmean(data[data > 0], axis=0)}).T # 计算调和均值:过滤0值 harm_mean = pd.DataFrame({'harmonic mean': hmean(data[data != 0], axis=0)}).T # 计算几何标准差 geom_std = pd.DataFrame({'geometric std': gstd(data[data > 0], axis=0)}).T # 计算加权均值:传入权重时才计算,需保证权重和数据列数匹配 weighted_mean = pd.DataFrame() if weights is not None and len(weights) == data.shape[1]: weighted_mean = pd.DataFrame({'weighted mean': data.apply(lambda col: (col * weights).sum() / sum(weights))}).T # 合并所有统计结果(用concat替代已弃用的append) result = pd.concat([stats, kurtosis, skewness, geom_mean, harm_mean, geom_std, weighted_mean]) return result
关键细节说明:
- 几何均值/标准差:
gmean和gstd要求数据全为正,所以先通过data[data > 0]过滤非正数,避免报错 - 调和均值:
hmean无法处理0值,提前过滤掉0再计算 - 加权均值:新增
weights参数,传入和数据列数一致的权重列表即可生成该指标;不需要时不传参数就不会显示 - 用
pd.concat替代了Pandas已弃用的append方法,保证代码兼容性
测试示例:
# 生成测试数据 test_data = pd.DataFrame({ 'col1': [1,2,3,4,5], 'col2': [2,4,6,8,10] }) # 无权重调用 print(describex(test_data)) # 带权重调用 print(describex(test_data, weights=[0.2, 0.8]))
内容的提问来源于stack exchange,提问作者Andrzej Andrzej
相关产品推荐
相关产品推荐

