Pandas 如何计算透视表中的总方差

Pandas 如何计算透视表中的总方差,pandas,pivot-table,Pandas,Pivot Table,当我在透视表中使用aggfunc=np.var时。我发现度量值变成了NaN。但是当涉及到aggfunc=np.sum时,它就不是了 使用aggfunc=np.var或aggfunc=np.std更改原始值的原因。我在文件里找不到答案 将熊猫作为pd导入 将numpy作为np导入 df=pd.DataFrame({“A”:[“foo”,“foo”,“foo”,“foo”,“foo”, “酒吧”、“酒吧”、“酒吧”、“酒吧”], “B”:[“一”、“一”、“一”、“二”、“二”, “一”、“一”、“

当我在透视表中使用
aggfunc=np.var
时。我发现度量值变成了
NaN
。但是当涉及到
aggfunc=np.sum
时,它就不是了

使用
aggfunc=np.var
aggfunc=np.std
更改原始值的原因。我在文件里找不到答案

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame({“A”:[“foo”,“foo”,“foo”,“foo”,“foo”,
“酒吧”、“酒吧”、“酒吧”、“酒吧”],
“B”:[“一”、“一”、“一”、“二”、“二”,
“一”、“一”、“二”、“二”],
“C”:[“小”、“大”、“大”、“小”,
“小”、“大”、“小”、“小”,
“大型”],
“D”:[1,2,2,3,3,4,5,6,7],
“E”:[2,4,5,5,6,6,8,9]})
打印(df.pivot_表(
索引=['A','B'],
值=['D','E'],
列=['C'],
aggfunc=np.sum,
边距=真,
页边距\u名称='sum',
dropna=False
))
打印('-'*100)
df=df.pivot\u表(
索引=['A','B'],
值=['D','E'],
列=['C'],
aggfunc=np.var,
边距=真,
页边距\u名称='var',
dropna=False
)
打印(df)
更重要的是,我发现
D=large
的var是
np.var([4.0,7.0,4.0])=2.0
而不是
5.583333

我所期望的是:

de
C大-小var大-小var
A B
一杆4.0 5.0 0.25 6.0 8.0 1.0
两个7.0 6.0 0.25 9.0 9.0 0
foo one 4.0 1.0 2.25 9.0 2.0 12.25
两个NaN 6.0 NaN 11.0 0.0
变量2.0 4.25 3.6 2.0 11.25 7.34
透视表中
aggfunc=np.var
的含义是什么?
熊猫使用的是
ddof=1
,有关
np.var
的详细信息,请参阅

当您只有一个值时,当您尝试除以零时,使用
ddof=1
的方差将为
NaN

D=large
的Var是
np.Var([2,2,4,7],ddof=1)=5.583333
,因此一切都是正确的(您必须使用单个值,而不是总和)。
如果您需要
var
ddof=0
,则您可以提供自己的功能:

def var0(x):
    return np.var(x, ddof=0)

print(df.pivot_table(
    index = ['A', 'B'],
    values = ['D', 'E'],
    columns = ['C'],
    aggfunc= var0,
    margins=True,
    margins_name = 'var',
    dropna = False
))
结果:

              D                     E                
C         large small       var large small       var
A   B                                                
bar one  0.0000  0.00  0.250000  0.00  0.00  1.000000
    two  0.0000  0.00  0.250000  0.00  0.00  0.000000
foo one  0.0000  0.00  0.222222  0.25  0.00  1.555556
    two     NaN  0.00  0.000000   NaN  0.25  0.250000
var      4.1875  3.04  3.555556  3.50  6.00  4.888889
            D                     E                  
C       large small       var large  small        var
A   B                                                
bar one   4.0  5.00  0.250000   6.0   8.00   1.000000
    two   7.0  6.00  0.250000   9.0   9.00   0.000000
foo one   4.0  1.00  2.250000   9.0   2.00  12.250000
    two   NaN  6.00  0.000000   NaN  11.00   0.000000
var       2.0  4.25  0.824219   2.0  11.25  26.792969

根据编辑的问题更新
包含
C
之和的透视表,以及作为边距列/行的总和的var

我们首先创建名为
var
的边距列/行的
sum
透视表。然后,我们使用
sum
表的
var
更新这些边距列/行:

dfs = df.pivot_table(
    index = ['A', 'B'],
    values = ['D', 'E'],
    columns = ['C'],
    aggfunc= np.sum,
    margins=True,
    margins_name = 'var',
    dropna = False)

dfs[[('D','var'),('E','var')]] = df.pivot_table(
    index = ['A', 'B'],
    values = ['D', 'E'],
    columns = ['C'],
    aggfunc= np.sum,
    dropna = False).stack().groupby(level=(0,1)).apply(var0)
dfs.iloc[-1] = dfs.iloc[:-1].apply(var0)
结果:

              D                     E                
C         large small       var large small       var
A   B                                                
bar one  0.0000  0.00  0.250000  0.00  0.00  1.000000
    two  0.0000  0.00  0.250000  0.00  0.00  0.000000
foo one  0.0000  0.00  0.222222  0.25  0.00  1.555556
    two     NaN  0.00  0.000000   NaN  0.25  0.250000
var      4.1875  3.04  3.555556  3.50  6.00  4.888889
            D                     E                  
C       large small       var large  small        var
A   B                                                
bar one   4.0  5.00  0.250000   6.0   8.00   1.000000
    two   7.0  6.00  0.250000   9.0   9.00   0.000000
foo one   4.0  1.00  2.250000   9.0   2.00  12.250000
    two   NaN  6.00  0.000000   NaN  11.00   0.000000
var       2.0  4.25  0.824219   2.0  11.25  26.792969

在边距行(最后一行)中,var列被计算为行var的var。我不明白OP是如何计算这两个单元格的值的。无论如何,它们似乎没有多大意义。

@Lydoo请查看我在求和之后对var的更新,尽管我不知道var/var单元格是如何达到3.55和4.88的。Sry,我犯了一个错误。实际上,我想用
aggfunc=sum
计算pivot\u表之后
D
的所有值的var。你的回答很有帮助,谢谢!