Pandas.DataFrame.median() 中位数 详解 含代码 含测试数据集 随Pandas版本持续更新

关于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 即计算每一列的中位数。并有以下参值可选:
      • 0 or ‘index’: 计算每列的中位数。 例2
      • 1 or ‘columns’: 计算每行的中位数。例3
      • None: 计算 DataFrame 所有元素的中位数,等效于 np.median(df.to_numpy().ravel()) 其底层逻辑是:例4
        1. 先将 DataFrame 转为 Numpy 二维数组。
        2. 将二维数组降维展平为一维数组。
        3. 对所有元素由小到大排序。
        4. 计算并返回中位数。

        ⚠️ 注意 :

        • axis=None ,请确保 skipna=True ,因为一旦有缺失值,计算结果只会返回缺失值。 例7

    新增于 Pandas 2.0.0 : axis 参数,新增于Pandas 2.0.0 版本。

skipna 忽略缺失值

  • skipna : bool, default True >

    skipna 参数,用于指定求中位数的时候是否忽略缺失值 ,默认 skipna=True ,即忽略缺失值:

    • True: 忽略缺失值(默认)。
    • False: 不忽略缺失值, 但是如果存在缺失值,会影响计算结果,导致返回NaN例5

      ⚠️ 注意 :

      • 如果 skipna=False ,当某列或某行只有缺失值,计算结果也将是缺失值。 例6

numeric_only 只计算数字类型的行或列

  • numeric_only : bool, default False

    numeric_only 参数,用于控制是否 只计算数值类型浮点数(float),整数(int),布尔值(boolean)的行或列:

    ⚠️ 数值类型包括 :

    • 浮点数(float)
    • 整数(int)
    • 布尔值(boolean)
    • 复数(Complex) 注意!官方的文档中并没有声明支持复数的中位数计算。如果你的数据中,包含 复数 。虽然也可以进行计算,但实际上 Pandas 会先将其转为 实数 。这将导致精度丢失。 例5
    • False: 计算所有类型行或列的中位数。
    • True: 只计算纯数值类型的行或列的中位数。例5

**kwargs

  • **kwargs :

    用于保持和 numpy 兼容而保留的参数,一般不需要使用。

相关方法:

➡️ 相关方法


示例:

测试文件下载:

本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。

若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。

测试文件下载位置.png

测试文件下载位置

例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)

Series 传递  引发的

Series 传递 `axis=1` 引发的 `ValueError`

例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列由于是字符串,所以没有被计算中位数。

注意观察结果,虽然官方文档中并没有声明支持复数的中位数计算,但是实际上复数这一列,也得到了中位数的计算结果。

观察爆出的警告可知,其实际上是将复数转为实数后再计算中位数。毋庸置疑,这将导致复数的中位数结果精度的丢失。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-27 15:52:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-27 15:52:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-27 15:52:01       87 阅读
  4. Python语言-面向对象

    2024-01-27 15:52:01       96 阅读

热门阅读

  1. 每日OJ题_算法_二分查找⑥_力扣162. 寻找峰值

    2024-01-27 15:52:01       56 阅读
  2. Python面试题

    2024-01-27 15:52:01       62 阅读
  3. Conan2: starting at a text book example

    2024-01-27 15:52:01       36 阅读
  4. 万年历(方法版)

    2024-01-27 15:52:01       56 阅读
  5. 速盾:服务器接入CDN后上传图片失败的解决方案

    2024-01-27 15:52:01       44 阅读
  6. Git推送大量内容导致http 413错误

    2024-01-27 15:52:01       61 阅读
  7. 方法的重载

    2024-01-27 15:52:01       47 阅读