关于Pandas版本: 本文基于 pandas2.2.0 编写。
关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。
传送门: Pandas API参考目录
传送门: Pandas 版本更新及新特性
传送门: Pandas 由浅入深系列教程
Pandas.DataFrame.var()
Pandas.DataFrame.var
方法用于返回行或列的方差,默认 ddof=1
返回 样本方差
。
计算公式:
-
样本方差公式
Pandas.DataFrame.var
默认的方差计算方法是以n-1
为底,即样本方差: -
总体方差公式
语法:
DataFrame.var(axis=0, skipna=True, ddof=1, numeric_only=False, **kwargs)
返回值:
-
Series or DataFrame (if level specified)
- 返回
Series
或DataFrame
,依传输的数据结构而定。
- 返回
参数说明:
axis 指定计算方向(行或列)
-
axis : {0 or ‘index’, 1 or ‘columns’}, default 0
axis
参数,用于指定计算方向,即按行计算或按列计算方差:- 如果是
Series
此参数无效,将始终保持axis=0
,即计算整列的方差。 - 如果是
DataFrame
默认为axis=0
即计算每一列的方差。并有以下参值可选:- 0 or ‘index’: 计算每列的方差。
- 1 or ‘columns’: 计算每行的方差。
- 如果是
skipna 忽略缺失值
-
skipna : bool, default False >
skipna
参数,用于指定求方差的时候是否忽略缺失值:- False: 不忽略,缺失值 在求方差的时候,会被解析为浮点数
float 0.0
。 - True: 忽略缺失值。
- False: 不忽略,缺失值 在求方差的时候,会被解析为浮点数
numeric_only 排除非纯数值的行或列
-
numeric_only : bool, default False
numeric_only
参数,用于控制是否 排除非纯数值的行或列:- False: 不排除。
- True: 只对纯数值型的行或列计算方差。
ddof 自由度修正
-
ddof : int, default 1
ddof
: Delta 自由度,用于计算的除数是N-ddof
,其中N
代表元素的数量。默认ddof=1
。- ddof=1 计算 样本方差(默认)。
- ddof=0 计算 总体方差。
- 当
ddof=0
DataFrame.var
的行为和numpy.var
一致。
- 当
-
⚠️ddof 应该如何取值?:
- 如果你准备计算方差的数据,是某个总体数据集的一部分样本,你想通过这一部分样本对总体数据集的方差进行无偏估计,则可以选择使
ddof=1
或保持默认。进行样本方差
的计算。 - 如果你准备计算方差的数据,就是你的总体数据集的全部,你可以选择使
ddof=0
。进行总体方差
的计算。
- 如果你准备计算方差的数据,是某个总体数据集的一部分样本,你想通过这一部分样本对总体数据集的方差进行无偏估计,则可以选择使
相关方法:
示例:
测试文件下载:
本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。
若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。
例1:如果是 Series
始终保持 axis=0
,即计算整列的方差。
import numpy as np
import pandas as pd
s = pd.Series([24.0, np.nan, 21.0, 33, 26], name="age")
s.var()
26.0
例2、求 DataFrame
每列的样本方差
import numpy as np
import pandas as pd
df = pd.DataFrame(
{
"person_id": [0, 1, 2, 3],
"age": [21, 25, 62, 43],
"height": [1.61, 1.87, 1.49, 2.01],
}
).set_index("person_id")
df.var()
age 352.916667
height 0.056367
dtype: float64
例3、求 DataFrame
每行的样本方差
import numpy as np
import pandas as pd
df = pd.DataFrame(
{
"person_id": [0, 1, 2, 3],
"age": [21, 25, 62, 43],
"height": [1.61, 1.87, 1.49, 2.01],
}
).set_index("person_id")
df.var(axis=1)
person_id
0 187.98605
1 267.49845
2 1830.73005
3 840.09005
dtype: float64
例4:如果整行或整列,都是缺失值,那么方差计算结果也是缺失值。
import pandas as pd
import numpy as np
df = pd.DataFrame({"A": [0.5, 0.2], "B": ["a", 0.7], "C": [np.NaN, np.NaN]})
df.var(axis=0, numeric_only=True)
A 0.045
C NaN
dtype: float64
C列由于都是缺失值,计算结果也是缺失值。
例5:numeric_only=True
只对数值类型的数据求样本方差。
import pandas as pd
df = pd.DataFrame({"A": [0.5, 1, 2], "B": ["a", "a", "a"], "C": [True, True, True]})
df.var(axis=0, numeric_only=True)
A 0.583333
C 0.000000
dtype: float64
B列由于字符串,所以没有被计算方差
例6:控制自由度修正值,当 ddof=0
将计算 总体方差。
观察计算每列样本方差的结果
df = pd.DataFrame(
{
"person_id": [0, 1, 2, 3],
"age": [21, 25, 62, 43],
"height": [1.61, 1.87, 1.49, 2.01],
}
).set_index("person_id")
df.var()
age 352.916667
height 0.056367
dtype: float64
观察计算每列总体方差的结果
df.var(ddof=0)
age 264.687500
height 0.042275
dtype: float64