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

关于Pandas版本: 本文基于 pandas2.2.0 编写。

关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。

传送门: Pandas API参考目录

传送门: Pandas 版本更新及新特性

传送门: Pandas 由浅入深系列教程

本节目录

  • Pandas.DataFrame.quantile()
    • 语法:
    • 返回值:
    • 参数说明:
      • q 分位
      • axis 指定计算方向
      • numeric_only 只计算数据类型为数值的行或列
      • interpolation 插值法
      • method 按列计算或整表计算
    • 相关方法:
    • 示例:
      • 例1:计算一个或多个分位数()
      • 例2、计算行或列的分位数
      • 例3、默认返回分位数,设置为 `normalize=True` 则返回分位数比
      • 例4:日期时间类型,日期时间差类型,也可以计算分位数

Pandas.DataFrame.quantile()

DataFrame.quantile 方法用于返回 DataFrame 行或列的分位数。

⚠️ 注意 :

  • 缺失值 不会参与计算。例如[2, 4, 6, 8,pd.NA],元素数量 n = 4 n=4 n=4
  • DataFrame.quantile所用计算公式,不同于【普通高中教科书 人教版2022年7月第4次印刷 数学B版 必须 第二册】第65页学到的方法。如果你需要使用教科书上的方法,则需要自己写函数。

语法:

DataFrame.quantile(q=0.5, axis=0, numeric_only=False, interpolation=‘linear’, method=‘single’)

返回值:

  • Series or DataFrame
    • 如果同时计算多个分位数,则返回 DataFrame
    • 如果只计算一个分位数,则返回 Series

参数说明:

q 分位

  • q : float or array-like, default 0.5 (50% quantile) 例1

    q 参数,用于指分位,取值范围 0 <= q <= 1,默认 q=0.5 即计算 50% 分位数(中位数)。 该参数接受以下类型的传入:

    • float: 浮点数,适用于只计算一个分位数。
    • array-like: 一个 类似数组,适用于同时计算多个分位数。

axis 指定计算方向

  • axis : {0 or ‘index’, 1 or ‘columns’}, default 0

    axis 参数,用于控制计算方向,即计算整列数据的分位数,或计算整行数据的分位数:例2

    • 0 or ‘index’: 计算整列数据的分位数(默认)。
    • 1 or ‘columns’ 计算整行数据的分位数。

numeric_only 只计算数据类型为数值的行或列

  • numeric_only : bool, default False

    numeric_only 参数,用于控制是否只计算数据类型是数值的行或列:例3

    • False: 所有类型的行或列,都可以参与分位数计算(默认)。
    • True: 只计算数据类型为数值的行或列。

    ⚠️ 注意 :

    【官方定义的数值型】:float, int , boolean 传送门:官方API文档

    实际应用中的结果是:

    • 布尔型 boolean 的行或列,会报错 TypeError例3-3
    • 即使 numeric_only=True 复数型 compile 也会参与分位数计算。但是会报错 TypeError例3-4
    • numeric_only=True 时, datetimetimedelta 类型的数据,也可以计算分位数。例5

    📌 改动于 Pandas 2.0.0 :

    numeric_only 参数的默认值,变更为 False

interpolation 插值法

  • interpolation : {‘linear’, ‘lower’, ‘higher’, ‘midpoint’, ‘nearest’}

    interpolation 参数,用于控制 p o s pos pos 不是整数时的取值方法,默认 interpolation=‘linear’ 使用线性插值法例4

    ⚠️ 分位数线性插值法 :

    在数组 x x x 求分位数,分为两个步骤:

    1. 求位置 p o s pos pos 将数组从小到大排列,定位到数组的 p % p\% p% 位置
      • p o s = 1 + ( n − 1 ) ⋅ p % pos = 1 + (n - 1) \cdot p\% pos=1+(n1)p%
      • 其中, p o s pos pos 是分位数在数组中的位置, n n n 是元素总数量, p % p\% p% 是分位点。
    2. 求分位数 Q p Q_{p} Qp p o s pos pos 位置取值。
      • 如果 p o s pos pos 是整数: Q p = x p o s Q_{p} = x_{pos} Qp=xpos
      • 如果 p o s pos pos 不是整数:
        1. i i i 为小于 p o s pos pos 的最小整数, j j j 为大于 p o s pos pos 的最小整数, δ δ δ p o s pos pos 的小数部分
        2. $Q_{p} = {x_i} + ({x_j} - {x_i}) \cdot δ $
    • ‘linear’: 线性插值法, $Q_{p} = {x_i} + ({x_j} - {x_i}) \cdot δ $
    • ‘lower’: 较小值 Q p = x i Q_{p} = {x_i} Qp=xi
    • ‘higher’: 较大值 Q p = x j Q_{p} = {x_j} Qp=xj
    • ‘nearest’: 最近值(较小值 x i {x_i} xi 或 较大值 x j {x_j} xj ,哪个近就取哪个) ,
    • ‘midpoint’: 中间值 Q p = x i + x j 2 Q_{p} = \frac{{x_{\text{i}} + x_{\text{j}}}}{2} Qp=2xi+xj ,其实就是较小值和较大值的平均值。

method 按列计算或整表计算

  • method : {‘single’, ‘table’}, default ‘single’

    method 参数,是按列计算分位数(‘single’)还是整表的分位数(‘table’):

    • ‘single’: 所有的行或列单独计算。
    • ‘table’: 计算整个表的分位数。

      ⚠️ 注意 :

      method='table' 时,允许的插值方法仅有 'nearest''lower''higher'

    ⚠️ BUG :

    method=‘table’ 设计的初衷是可以计算整个DF的分位数,而不是只按行、列计算。

    但是,经过测试,method='table’这个参数并没有生效。测试版本为2.2.0。

    这个参数的设计初衷详见:https://github.com/pandas-dev/pandas/issues/43881

相关方法:

➡️ 相关方法


  • Series.quantile

    分位数

示例:

测试文件下载:

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

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

测试文件下载位置.png

测试文件下载位置

例1:计算一个或多个分位数()

例1-1、创建演示数据

import pandas as pd

df = pd.DataFrame({"第1组数据": [2, 4, 6, 8, pd.NA], "第2组数据": [2, 4, 6, 8, 10]})
df
第1组数据第2组数据
022
144
266
388
4<NA>10

例1-2、只计算25%分位数(第一四分位数)

df.quantile(q=0.25)
第1组数据    3.5
第2组数据    4.0
Name: 0.25, dtype: object

注意观察计算结果,第1组数据,包含缺失值,但是在计算过程中,并没有被计算到元素数量 n n n

例1-3、同时计算25%分位数(第一四分位数)和50%分位数(中位数)

df.quantile(q=[0.25, 0.5])
第1组数据第2组数据
0.253.54.0
0.505.06.0

例2、计算行或列的分位数

例2-1、计算列的分位数,可以保持axis参数为空,也可以使axis=0

df.quantile([0.25, 0.5])  # 等效于df.quantile([0.25,0.5],axis=0)
第1组数据第2组数据
0.253.54.0
0.505.06.0

例2-2、计算行的分位数

df.quantile([0.25, 0.5], axis=1)
01234
0.252.04.06.08.010.0
0.502.04.06.08.010.0

例2-3、如果保持默认,什么都不传递,则所有列都参与分位数计算。(为了方便观察,使用 to_frame 方法,把返回的 SeriesDataFrame 的形式展现)

df.quantile().to_frame()
count
成年体数量幼体的数量
402
221
601

例3、默认返回分位数,设置为 normalize=True 则返回分位数比

例3-1、创建演示数据

import pandas as pd

df2 = pd.DataFrame(
    {
        "包含缺失值": [1, 2, 3, pd.NA],
        "包含字符串": [1, 2, 3, "a"],
        "整数型": [1, 2, 3, 4],
        "浮点数": [1.0, 2.0, 3.0, 4.0],
        "布尔型": [True, True, False, False],
        "复数型": [1 + 1j, 2 + 1j, 3 + 1j, 4 + 1j],
    }
)
df2
包含缺失值包含字符串整数型浮点数布尔型复数型
01111.0True1.0+1.0j
12222.0True2.0+1.0j
23333.0False3.0+1.0j
3<NA>a44.0False4.0+1.0j

例3-2、手动筛选,不包含布尔型和复数型,观察当 numeric_only=True 会有哪些列参与计算

df2.iloc[:, 0:4].quantile([0.25, 0.5], numeric_only=True)
整数型浮点数
0.251.751.75
0.502.502.50


例3-3、让布尔型参与进来,会报错 TypeError

df2.iloc[:, 0:5].quantile([0.25, 0.5], numeric_only=True)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[37], line ---->--> 1 df2.iloc[:,0:5].quantile([0.25, 0.5], numeric_only=Tre...
...
...6     # asanyarray is a stop-gap until gh-13105
   4657     lerp_interpolation = asanyarray(add(a, diff_b_a * t, out=out))

TypeError: numpy boo
```lean subtract, the `-` operator, is not supported, use the bitwise_xor, the `^` operator, or the logical_xor function instead.

<a id="DataFrame.quantile_e3-4"></a>3-4、让复数型参与进来,会报错`TypeError`


```python
df2.iloc[:, [0, 1, 2, 3, 5]].quantile([0.25, 0.5], numeric_only=True)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[43], line 1
----> 1 df2.iloc[:, [0, 1, 2, 3, 5]].quantile([0.25, 0.5], numeric_only=Tr
...
...
...
File D:\ProgramData\miniconda3\envs\python3.12\Lib\site-packages\numpy\lib\function_base.py:4277, in percentile(a, q, axis, out, overwrite_input, method, keepdims, interpolation)
   4275 a = np.asanyarray(a)
   4276 if a.dtype.kind == "c":
-> 4277     raise TypeError("a must be an array of real numbers")
   4279 q = np.true_divide(q, 100)
   4280 q = asanyarray(q)  # undo any decay that the ufunc performed (see gh-13105)

TypeError: a must be an array of real 
```numbersue)

<a id="DataFrame.quantile_e4"></a>
### 例4:使用不同的插值法计算分位数4-1、默认 `interpolation=‘linear’` 使用线性插值法


```python
import pandas as pd

df3 = pd.DataFrame(
    {
        "包含缺失值": [1, 2, 3, pd.NA],
        "整数型": [1, 2, 3, 4],
        "浮点数": [1.0, 2.0, 3.0, 4.0],
    }
)

df3.quantile([0.25, 0.5])
包含缺失值整数型浮点数
0.251.51.751.75
0.502.02.502.50

例4-2、使用平均值插值法

df3.quantile([0.25, 0.5], interpolation='midpoint')
包含缺失值整数型浮点数
0.251.51.51.5
0.502.02.52.5

例4:日期时间类型,日期时间差类型,也可以计算分位数

import pandas as pd

df = pd.DataFrame({'A': [1, 2],
                   'B': [pd.Timestamp('2010'),
                         pd.Timestamp('2011')],
                   'C': [pd.Timedelta('1 days'),
                         pd.Timedelta('2 days')]})
df.quantile([0.2,0.5], numeric_only=False)
ABC
0.21.22010-03-15 00:00:001 days 04:48:00
0.51.52010-07-02 12:00:001 days 12:00:00

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/360186.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask 入门2:路由

1. 前言 在上一节中&#xff0c;我们使用到了静态路由&#xff0c;即一个路由规则对应一个 URL。而在实际应用中&#xff0c;更多使用的则是动态路由&#xff0c;它的 URL是可变的。 2. 定义一个很常见的路由地址 app.route(/user/<username>) def user(username):ret…

java servlet勤工助学家教管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 勤工助学家教管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myecli…

streampark+flink一键整库或多表同步mysql到doris实战

streamparkflink一键整库或多表同步mysql到doris实战&#xff0c;此应用一旦推广起来&#xff0c;那么数据实时异构时&#xff0c;不仅可以减少对数据库的查询压力&#xff0c;还可以减少数据同步时的至少50%的成本&#xff0c;还可以减少30%的存储成本&#xff1b; streampar…

2024年【天津市安全员C证】新版试题及天津市安全员C证模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证新版试题是安全生产模拟考试一点通总题库中生成的一套天津市安全员C证模拟考试题&#xff0c;安全生产模拟考试一点通上天津市安全员C证作业手机同步练习。2024年【天津市安全员C证】新版试题及天津市…

java基础(面试用)

一、基本语法 1. 注释有哪几种形式&#xff1f; //单行注释&#xff1a;通常用于解释方法内某单行代码的作用。 //int i 0;//多行注释&#xff1a;通常用于解释一段代码的作用。 //int i 0; //int i 0;//文档注释&#xff1a;通常用于生成 Java 开发文档。 /* *int i 0; …

实现自己的小功能(方案二)

第一套方案废弃的原因是数据不准确&#xff0c;大家可以使用Tushare试试&#xff0c;多测试一些。 方案二的整体流程&#xff1a; 先随机检测数据&#xff08;50条&#xff09;处理后数据的精度问题&#xff08;第一套方案也遇到了这个问题&#xff09; 1、下载数据 使用通达…

马哈鱼SQLFlow Lite的python版本

Gudu SQLFlow 是一款用来分析各种数据库的 SQL 语句和存储过程来获取复杂的数据血缘关系并进行可视化的工具。 Gudu SQLFlow Lite version for python 可以让 python 开发者把数据血缘分析和可视化能力快速集成到他们自己的 python 应用中。 Gudu SQLFlow Lite version for p…

【JAVA】Semaphore 有什么作用

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 二进制信号量&#xff1a; 2. 计数信号量&#xff1a; 结语 我的其他博客 前言 Semaphore&#xff08;信号量&#xff09;作为…

图扑 HT UI 5.0 全新升级,开箱即用!

为顺应数字时代的不断发展&#xff0c;图扑 HT UI 5.0 在原有功能强大的界面组件库的基础上进行了全面升级&#xff0c;融入了更先进的技术、创新的设计理念以及更加智能的功能。HT UI 5.0 使用户体验更为直观、个性化&#xff0c;并在性能、稳定性和安全性等方面达到新的高度。…

品牌时代:应对非对称性风险的战略与实践

市场环境中&#xff0c;非对称性风险成为企业必须直面的挑战。非对称性风险指的是企业在经营过程中面临的不确定性因素&#xff0c;这些因素可能导致企业遭受重大损失或获得巨大收益。为了应对这种风险&#xff0c;企业需要从产品导向转向品牌导向&#xff0c;通过品牌建设来提…

组件如何组织以提升维护性、扩展性

文章目录 一、提升组件的维护性和扩展性1.1、单一职责原则&#xff08;Single Responsibility Principle&#xff09;1.2、松耦合&#xff08;Loose Coupling&#xff09;1.3、高内聚&#xff08;High Cohesion&#xff09;1.4、模块化设计&#xff08;Modular Design&#xff…

C语言第十四弹---函数递归

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数递归 1、递归是什么&#xff1f; 1.1、递归的思想&#xff1a; 1.2、递归的限制条件 2、递归举例 2.1、举例1&#xff1a;求n的阶乘 2.1.1、分析和代码…

使用vue脚手架构建项目

一、前言 * 创建好vue-cli的环境&#xff0c;下载好vue包依赖* 本文使用环境&#xff1a;vue/cli 5.0.8二、步骤 创建vueTest文件夹&#xff0c;管理员身份运行cmd , 进入到vueTest文件夹 执行命令vue create 你的项目名 &#xff0c;这里我定义的项目名为: my-project 基于…

Django实例_后台管理及分页器

原理步骤参考: Django开发_14_后台管理及分页器-CSDN博客 一、创建Django项目 二、创建page_app python manage.py startapp page_app三、修改settings.py文件 (一)添加app (二)设置每页显示数据个数 (三)设置中文显示 四、总路由添加子路由路径 from django.contrib impo…

中国的茶文化:历史、传统与生活

中国的茶文化&#xff1a;历史、传统与生活 一、引言 茶&#xff0c;这一神奇而古老的饮品&#xff0c;与中国的历史、文化和生活方式紧密相连。中国的茶文化&#xff0c;源远流长&#xff0c;博大精深&#xff0c;是中华文明的重要组成部分。它不仅是一种饮料&#xff0c;更是…

Hutool导入导出用法

整理了下Hutool导入导出的简单使用。 导入maven或jar包&#xff08;注意这里导入的poi只是为了优化样式&#xff09; <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency><groupId>cn.hutool</groupId><artifactId&g…

用低版本python的时候pip无法联网

如图所示&#xff0c;我用较低版本pip&#xff08;3.7&#xff0c;3.8&#xff09;的时候pip无法使用代理联网 看报错是代理问题&#xff0c; 那么直接在pip的时候直接加上自己科学上网的代理就ok了 当然也可以换源解决&#xff0c;这个网上教程挺多的就自己搜搜好了hhh

在 Linux 中挂载新硬盘动态使用

目录 一&#xff1a;添加硬盘并且格式化 二&#xff1a;创建逻辑卷 三&#xff1a;挂载卷到目录 在 Linux 中挂载新硬盘并进行格式化的操作可以按照以下步骤进行&#xff1a; 一&#xff1a;添加硬盘并且格式化 查看现有分区状态和服务器安装的硬盘状态&#xff1a; df -…

SpringBoot---创建项目

介绍 此项目SpringBoot使用的是2.6.1版本&#xff0c;由于这个项目使用的是maven聚合方式创建的&#xff0c;所以第二步是我在聚合方式下需要添加的依赖&#xff0c;完整的pom.xml内容放到了最下面。 第一步&#xff1a;创建Maven项目 这个里什么也不勾选&#xff0c;直接点…

Java面向对象详解

面向对象和面向过程的区别&#xff1a; 面向对象和面向过程都是对软件分析、设计和开发的一种思想&#xff0c;它指导着人们以不同的方式去分析、设计和开发软件。C语言是一种典型的面向过程语言&#xff0c;Java是一种典型的面向对象语言。 面向过程适合简单、不需要协作的事务…