关于Pandas版本: 本文基于 pandas2.2.0 编写。
关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。
传送门: Pandas API参考目录
传送门: Pandas 版本更新及新特性
传送门: Pandas 由浅入深系列教程
Pandas.DataFrame.median()
Pandas.DataFrame.median
方法用于返回行或列的所有元素的中位数。
计算公式:
- 对于奇数个数据:
中位数是排序后位于中间位置的数。 Med = 中间位置的数 \text{Med} = {中间位置的数} Med=中间位置的数 - 对于偶数个数据:
中位数是排序后中间两个数的平均值。 Med = 中间两个数之和 2 \text{Med} = \frac{\text{中间两个数之和}}{2} Med=2中间两个数之和。。
语法:
DataFrame.median(axis=0, skipna=True, numeric_only=False, **kwargs)
返回值:
- Series or scalar
参数说明:
axis 指定计算方向(行或列)
-
axis : {index (0), columns (1, None)
axis
参数,用于指定计算方向,即按行计算或按列计算中位数:- 如果是
Series
此参数无效,将始终保持axis=0
,即计算整列的中位数。axis=1
则会报错ValueError
例1 - 如果是
DataFrame
默认为axis=0
即计算每一列的中位数。并有以下参值可选:
✅ 新增于 Pandas 2.0.0 :
axis
参数,新增于Pandas 2.0.0 版本。 - 如果是
skipna 忽略缺失值
-
skipna : bool, default True >
skipna
参数,用于指定求中位数的时候是否忽略缺失值 ,默认skipna=True
,即忽略缺失值:
numeric_only 只计算数字类型的行或列
-
numeric_only : bool, default False
numeric_only
参数,用于控制是否 只计算数值类型浮点数(float),整数(int),布尔值(boolean)的行或列:⚠️ 数值类型包括 :
- 浮点数(float)
- 整数(int)
- 布尔值(boolean)
- 复数(Complex) 注意!官方的文档中并没有声明支持复数的中位数计算。如果你的数据中,包含 复数 。虽然也可以进行计算,但实际上 Pandas 会先将其转为 实数 。这将导致精度丢失。 例5
- False: 计算所有类型行或列的中位数。
- True: 只计算纯数值类型的行或列的中位数。例5
**kwargs
-
**kwargs :
用于保持和
numpy
兼容而保留的参数,一般不需要使用。
相关方法:
➡️ 相关方法
中位数
示例:
测试文件下载:
本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。
若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。
例1:如果是 Series
始终保持 axis=1
,会报错!
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],
}
)
# 单独使用age列,本质上相当于使用了Series
df["age"].median(axis=1)
例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],
}
)
df.median()
person_id 1.50
age 34.00
height 1.74
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],
}
)
df.median(axis=1)
0 1.61
1 1.87
2 2.00
3 3.00
dtype: float64
例4、axis=None
计算 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],
}
)
df.median(axis=None) # 等效于 np.median(df.to_numpy().ravel())
2.005
例5:如果不忽略缺失值,会影响计算结果,导致只返回 NaN
import numpy as np
import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3, np.NaN, 4]})
df.median(skipna=False)
A NaN
dtype: float64
例6:如果某列或某行都是缺失值,并且 skipna=False
只会返回缺失值
import numpy as np
import pandas as pd
df = pd.DataFrame(
{
"person_id": [0, 1, 2, 3],
"age": [np.NaN, np.NaN, np.NaN, np.NaN],
"height": [1.61, 1.87, 1.49, 2.01],
}
)
df.median(skipna=False)
person_id 1.50
age NaN
height 1.74
dtype: float64
由于age列全是缺失值,所以只会返回缺失值。
例7:当 axis=None
,一定要确保 skipna=True
,否则会因为存在缺失值,导致计算结果只返回缺失值(NaN)
import numpy as np
import pandas as pd
df = pd.DataFrame(
{
"person_id": [0, 1, 2, 3],
"age": [1, 2, 3, np.NaN],
"height": [1.61, 1.87, 1.49, 2.01],
}
)
df.median(axis=None, skipna=False)
nan
由于age列存在缺失值,导致计算所有元素中位数后,只返回了 NaN,所以,请务必确保排除了缺失值,或保持 skipna=True
例8:numeric_only=True
只计算数值类型的行或列。
import numpy as np
import pandas as pd
df = pd.DataFrame(
{
"整数": [4, 1, 2, 3],
"浮点数": [1.5, 2.5, 3.5, 4.5],
"布尔值": [True, False, True, True],
"字符串": ["a", "b", "c", "d"],
"复数": [1 + 1j, 2 + 2j, 3 + 3j, 4 + 4j],
}
)
df.median(numeric_only=True)
D:\miniconda3\envs\python3.12\Lib\site-packages\pandas\core\nanops.py:789: ComplexWarning: Casting complex values to real discards the imaginary part
values = values.astype("f8")
整数 2.5
浮点数 3.0
布尔值 1.0
复数 2.5
dtype: float64
B列由于是字符串,所以没有被计算中位数。
注意观察结果,虽然官方文档中并没有声明支持复数的中位数计算,但是实际上复数这一列,也得到了中位数的计算结果。
观察爆出的警告可知,其实际上是将复数转为实数后再计算中位数。毋庸置疑,这将导致复数的中位数结果精度的丢失。