我有这样一个数据帧:

Category   Frequency
1             30000
2             45000
3             32400
4             42200
5             56300
6             98200

如何计算类别的平均值、中值和偏度?

我try 了以下方法:

df['cum_freq'] = [df["Category"]]*df["Frequnecy"]
mean = df['cum_freq'].mean()
median = df['cum_freq'].median()
skew = df['cum_freq'].skew()

推荐答案

如果总频率足够小,可以放入内存,使用repeat生成数据,然后您可以轻松调用这些方法.

s = df['Category'].repeat(df['Frequency']).reset_index(drop=True)

print(s.mean(), s.var(ddof=1), s.skew(), s.kurtosis())
# 4.13252219664584 3.045585008424625 -0.4512924988072343 -1.1923306818513022

否则,你将需要更复杂的代数来计算矩,这可以用k-statistics来完成,一些较低的矩可以用其他库来完成,比如numpystatsmodels.但对于偏度和峰度这样的事情,这是通过go 均值值的总和(根据计数计算)手动完成的.由于这些总和将溢出numpy,我们需要使用普通python.

def moments_from_counts(vals, weights):
    """
    Returns tuple (mean, N-1 variance, skewness, kurtosis) from count data
    """
    vals = [float(x) for x in vals]
    weights = [float(x) for x in weights]

    n = sum(weights)
    mu = sum([x*y for x,y in zip(vals,weights)])/n
    S1 = sum([(x-mu)**1*y for x,y in zip(vals,weights)])
    S2 = sum([(x-mu)**2*y for x,y in zip(vals,weights)])
    S3 = sum([(x-mu)**3*y for x,y in zip(vals,weights)])
    S4 = sum([(x-mu)**4*y for x,y in zip(vals,weights)])

    k1 = S1/n
    k2 = (n*S2-S1**2)/(n*(n-1))
    k3 = (2*S1**3 - 3*n*S1*S2 + n**2*S3)/(n*(n-1)*(n-2))
    k4 = (-6*S1**4 + 12*n*S1**2*S2 - 3*n*(n-1)*S2**2 -4*n*(n+1)*S1*S3 + n**2*(n+1)*S4)/(n*(n-1)*(n-2)*(n-3))
    
    return mu, k2, k3/k2**1.5, k4/k2**2

moments_from_counts(df['Category'], df['Frequency'])
#(4.13252219664584, 3.045585008418879, -0.4512924988072345, -1.1923306818513018)

statsmodels有一个很好的类来处理低阶矩和分位数.

from statsmodels.stats.weightstats import DescrStatsW

d = DescrStatsW(df['Category'], weights=df['Frequency'])

d.mean
#4.13252219664584

d.var_ddof(1)
#3.045585008418879

如果调用d.asrepeats(),则DescrStatsW类还允许您以数组的形式访问底层数据

Python相关问答推荐

人口全部乱序 - Python—Matplotlib—映射

在用于Python的Bokeh包中设置按钮的样式

使用类型提示进行类型转换

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

PySpark:如何最有效地读取不同列位置的多个CSV文件

Scipy差分进化:如何传递矩阵作为参数进行优化?

查找查找表中存在的列值组合

为什么我的scipy.optimize.minimize(method=";newton-cg";)函数停留在局部最大值上?

对于标准的原始类型注释,从键入`和`从www.example.com `?

仅取消堆叠最后三列

如何在Python中实现高效地支持字典和堆操作的缓存?

3.我无法找到制作这种三角形图案的方法

为什么任何一个HTML页面在保存到文件后都会变大6个字节?

django中没有预期的输出

JAX在接受数组的简单函数上使用.grad:`ConcretizationTypeError:在需要具体值的地方遇到抽象跟踪器值`

PANDA TO_DICT-按键列出行(_D)

SCRIT-学习定制转换器从底层模型抛出NotFittedError

在python中使用beta.rvs生成矩阵的最快方法

如果没有强制转换Numy数组,则通过ctype将Numy数组传递给C函数会产生错误的结果