如何在 Python 中将 NULL 值作为零包含在方差计算中?

How to include NULL values as zero to variance calculation in Python?

我在使用 "hidden" NULL(零)值计算方差时遇到问题。通常这不应该成为问题,因为 NULL 值不是一个值,但在我的例子中,必须将这些 NULL 作为零包含在方差计算中。所以我的数据框看起来像这样:

表A:

A   X   Y
1   1   30
1   2   20
2   1   15
2   2   20
2   3   20
3   1   30
3   2   35

然后我需要为每个不同的 X 值获取方差,我这样做:

TableA.groupby(['X']).agg({'Y':'var'})

但答案不是我所需要的,因为我需要方差计算当 A=1 和 A=3 时还包括 X=3 的 NULL 值 Y。

我的数据集应该是什么样子才能获得所需的方差结果:

A   X   Y
1   1   30
1   2   20
1   3   0
2   1   15
2   2   20
2   3   20
3   1   30
3   2   35
3   3   0

所以我需要方差来考虑每个 X 应该有 1,2 和 3 并且当某个 X 数字中没有 Y 值时它应该是 0。你能帮我吗?我应该如何更改我的 TableA 数据框才能执行此操作,还是有其他方法?

TableA 的预期输出应如下所示:

X   Y
1   75.000000
2   75.000000
3   133.333333

直接计算方差,但除以 A 的不同可能性的数量

# three in your example. adjust as needed
a_choices = len(TableA['A'].unique())

def variance_with_missing(vals):
    mean_with_missing = np.sum(vals) / a_choices
    ss_present = np.sum((vals - mean_with_missing)**2)
    ss_missing = (a_choices - len(vals)) * mean_with_missing**2
    return (ss_present + ss_missing) / (a_choices - 1)


TableA.groupby(['X']).agg({'Y': variance_with_missing})

以下解决方案的方法是附加 Y=0 的不存在的序列。有点乱,但希望这会有所帮助。

import numpy as np
import pandas as pd

TableA = pd.DataFrame({'A':[1,1,2,2,2,3,3],
             'X':[1,2,1,2,3,1,2],
             'Y':[30,20,15,20,20,30,35]})

TableA['A'] = TableA['A'].astype(int)

#### Create row with non existing sequence and fill with 0  ####

for i in range(1,TableA.X.max()+1):
    for j in TableA.A.unique():
        if not TableA[(TableA.X==i) & (TableA.A==j)]['Y'].values :
            TableA = TableA.append(pd.DataFrame({'A':[j],'X':[i],'Y':[0]}),ignore_index=True)


TableA.groupby('X').agg({'Y':np.var})