如何在 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})
我在使用 "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})