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。你的回答很有帮助,谢谢!