0

0

Python如何实现数据的分位数计算?

看不見的法師

看不見的法師

发布时间:2025-07-24 09:49:02

|

896人浏览过

|

来源于php中文网

原创

python中计算数据的分位数,主要通过numpy和pandas库实现。1. numpy的percentile()函数适用于数组数据,接受数据和0到100之间的百分位数参数;2. pandas的quantile()方法适用于dataframe或series,接受0到1之间的分位数参数,更适合结构化数据;3. 两者均支持插值方法设置,如linear、lower、higher、nearest和midpoint,用于处理分位点位于数据点之间的情况;4. pandas默认忽略nan值进行计算,而numpy会返回nan;5. 异常值对分位数影响有限,但极高或极低分位数时需谨慎处理;6. 使用groupby().quantile()可对分组数据分别计算分位数,适用于多类别数据分析。掌握这些方法可有效支持从基础到高级的分位数计算需求。

Python如何实现数据的分位数计算?

Python中实现数据的分位数计算,主要依赖于NumPy和Pandas这两个核心库。它们提供了直观且功能强大的函数,能让你轻松获取数据集的任意分位数,无论是单个数值序列还是复杂的数据框。

Python如何实现数据的分位数计算?

解决方案

在Python里,计算数据的分位数,最常用的方法莫过于借助NumPy库的percentile函数,以及Pandas库中DataFrame或Series对象的quantile方法。它们各自有其适用场景,但核心功能都是一致的:帮你找到数据集中特定比例点上的数值。

对于一个简单的数值列表或NumPy数组,numpy.percentile是首选。它接受数据数组和一个0到100之间的百分位数(例如,25代表25th百分位数,也就是第一四分位数)。

立即学习Python免费学习笔记(深入)”;

Python如何实现数据的分位数计算?
import numpy as np

data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 计算25th百分位数 (第一四分位数)
q1 = np.percentile(data, 25)
print(f"25th百分位数 (Q1): {q1}")

# 计算中位数 (50th百分位数)
median = np.percentile(data, 50)
print(f"中位数: {median}")

# 计算75th百分位数 (第三四分位数)
q3 = np.percentile(data, 75)
print(f"75th百分位数 (Q3): {q3}")

# 也可以同时计算多个分位数
quantiles = np.percentile(data, [25, 50, 75])
print(f"25th, 50th, 75th百分位数: {quantiles}")

如果你正在处理结构化的表格数据,比如Pandas DataFrame,那么直接使用DataFrame或Series的.quantile()方法会更加便捷。这个方法接受一个0到1之间的分位数(例如,0.25代表25th百分位数)。

import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'B': [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
})

# 计算列'A'的25th分位数
q1_A = df['A'].quantile(0.25)
print(f"列'A'的25th分位数: {q1_A}")

# 计算整个DataFrame所有数值列的50th分位数
# 默认按列计算
median_df = df.quantile(0.5)
print(f"\nDataFrame的50th分位数:\n{median_df}")

# 同时计算多个分位数
multi_quantiles_df = df.quantile([0.25, 0.5, 0.75])
print(f"\nDataFrame的25th, 50th, 75th分位数:\n{multi_quantiles_df}")

这两个方法在实际应用中非常灵活,基本能满足你对分位数计算的绝大部分需求。

Python如何实现数据的分位数计算?

理解分位数计算中的插值方法:Python如何处理?

分位数,尤其是当数据点数量不多,或者所求分位数恰好落在两个数据点之间时,它的计算方式其实并不是唯一的。这里就涉及到“插值”的概念。NumPy的np.percentile和Pandas的.quantile都提供了interpolation(或Pandas中叫method)参数来指定这种处理方式,这对于理解结果的细微差异至关重要。

我个人在工作中就遇到过,不同工具或库计算出的同一个分位数结果略有不同,排查下来往往就是插值方法的差异。常见的插值方法有:

  • 'linear' (线性插值):这是NumPy和Pandas的默认方法。它会根据分位数的位置,在线性假设下在两个最近的数据点之间进行插值。比如,如果25th百分位数落在第2个和第3个数据点之间,它会根据距离按比例计算出一个值。这通常是统计学中最常用的方法。
  • 'lower' (向下取整):取小于或等于所需分位数位置的最近数据点。
  • 'higher' (向上取整):取大于或等于所需分位数位置的最近数据点。
  • 'nearest' (最近点):取离所需分位数位置最近的数据点。
  • 'midpoint' (中点):取'lower'和'higher'结果的平均值。

我们来看一个例子,感受一下不同插值方式的区别:

data_odd = np.array([1, 2, 3, 4, 5]) # 奇数个数据点

# 25th百分位数
print(f"数据: {data_odd}")
print(f"线性插值 (默认): {np.percentile(data_odd, 25, interpolation='linear')}") # 结果是2.0,因为25%位置在1和2之间,线性插值
print(f"向下取整: {np.percentile(data_odd, 25, interpolation='lower')}") # 结果是2
print(f"向上取整: {np.percentile(data_odd, 25, interpolation='higher')}") # 结果是2
print(f"最近点: {np.percentile(data_odd, 25, interpolation='nearest')}") # 结果是2
print(f"中点: {np.percentile(data_odd, 25, interpolation='midpoint')}") # 结果是2

data_even = np.array([1, 2, 3, 4, 5, 6]) # 偶数个数据点
# 25th百分位数
print(f"\n数据: {data_even}")
print(f"线性插值 (默认): {np.percentile(data_even, 25, interpolation='linear')}") # 结果是2.25
print(f"向下取整: {np.percentile(data_even, 25, interpolation='lower')}") # 结果是2
print(f"向上取整: {np.percentile(data_even, 25, interpolation='higher')}") # 结果是3
print(f"最近点: {np.percentile(data_even, 25, interpolation='nearest')}") # 结果是2
print(f"中点: {np.percentile(data_even, 25, interpolation='midpoint')}") # 结果是2.5

你会发现,当百分位点正好落在某个数据点上时,这些方法的结果可能相同;但一旦落在数据点之间,差异就显现出来了。理解并选择合适的插值方法,对于确保你的分位数计算结果符合特定场景的统计定义至关重要。我通常会坚持使用默认的linear,除非有明确的业务或统计要求需要采用其他方法。

华友协同办公自动化OA系统
华友协同办公自动化OA系统

华友协同办公管理系统(华友OA),基于微软最新的.net 2.0平台和SQL Server数据库,集成强大的Ajax技术,采用多层分布式架构,实现统一办公平台,功能强大、价格便宜,是适用于企事业单位的通用型网络协同办公系统。 系统秉承协同办公的思想,集成即时通讯、日记管理、通知管理、邮件管理、新闻、考勤管理、短信管理、个人文件柜、日程安排、工作计划、工作日清、通讯录、公文流转、论坛、在线调查、

下载

处理数据中的异常值与缺失值对分位数计算的影响

在实际的数据分析工作中,数据往往不会那么“干净”。缺失值(NaN)和异常值是常态。它们对分位数计算的影响是显而易见的,而且如果不加处理,可能会导致计算结果失真,甚至直接报错。

首先说缺失值。NumPy的percentile函数在遇到数组中有NaN时,默认会返回NaN,因为它无法对非数值进行排序和计算。Pandas的quantile方法则更加智能,它默认会跳过NaN值进行计算。

data_with_nan = np.array([1, 2, np.nan, 4, 5])
# NumPy遇到NaN会返回NaN
# print(np.percentile(data_with_nan, 50)) # 这会输出nan

df_with_nan = pd.DataFrame({'C': [1, 2, np.nan, 4, 5]})
# Pandas默认跳过NaN
print(f"Pandas处理NaN后的中位数: {df_with_nan['C'].quantile(0.5)}")

虽然Pandas默认行为很方便,但在某些情况下,你可能需要更明确地处理缺失值。比如,你可以选择删除包含NaN的行(dropna()),或者用一个合理的值进行填充(fillna()),这取决于你的数据特性和分析目标。

至于异常值,它们不会直接导致计算失败,但会极大地“拉偏”你的分位数。比如,如果你有一组数据是[1, 2, 3, 4, 1000],那么1000这个异常值会使得均值大幅度上升,但对于中位数(50th百分位数)的影响则小得多,它仍然是3。然而,如果你计算的是99th百分位数,这个1000就可能是决定性的了。

在分位数分析中,分位数本身就是一种对异常值相对稳健的统计量(特别是中位数和四分位数)。它们不像均值那样容易受到极端值的影响。但如果你在计算极高或极低分位数(如99.9th或0.1th)时,异常值的影响就会凸显出来。在这种情况下,通常的做法是:

  1. 数据清洗:在计算分位数之前,先识别并处理异常值。这可能包括删除它们、替换为合理值(如均值、中位数),或者进行数据转换。
  2. 分位数本身作为异常值检测工具:分位数,特别是四分位数间距(IQR = Q3 - Q1),是识别异常值的有力工具。任何超出Q1 - 1.5 * IQRQ3 + 1.5 * IQR范围的数据点,通常被认为是潜在的异常值。

我通常会先对数据进行探索性分析,画个箱线图或者直方图,看看数据的分布和有没有明显的异常点。在确认数据质量后再进行分位数计算,这样结果才更可靠。

Python中如何计算分组数据的分位数?

在数据分析中,我们经常需要对数据进行分组,然后计算每个组的分位数,而不是整个数据集的分位数。比如,你可能想知道不同产品类别、不同地区或不同用户群体销售额的25th、50th、75th分位数。Pandas库的groupby()功能与quantile()方法结合,能非常优雅地解决这个问题。

这在实际业务分析中简直是家常便饭。比如,分析电商平台不同SKU的销售额分布,或者不同渠道的客户生命周期价值(LTV)分布,分组分位数就能提供非常细致的洞察。

来看一个具体的例子:假设我们有一个包含产品销售数据的DataFrame,我们想按产品类别计算销售额的分位数。

import pandas as pd
import numpy as np

# 模拟一些销售数据
data = {
    'Product_Category': ['Electronics', 'Books', 'Electronics', 'Books', 'Books', 'Electronics', 'Books', 'Electronics', 'Books', 'Electronics'],
    'Sales_Amount': [1200, 50, 1500, 75, 60, 1100, 90, 1800, 80, 1300]
}
df_sales = pd.DataFrame(data)

print("原始销售数据:\n", df_sales)

# 按产品类别分组,并计算每个组的销售额中位数 (50th分位数)
median_sales_by_category = df_sales.groupby('Product_Category')['Sales_Amount'].quantile(0.5)
print(f"\n按产品类别划分的销售额中位数:\n{median_sales_by_category}")

# 同时计算多个分位数 (25th, 50th, 75th)
multi_quantiles_by_category = df_sales.groupby('Product_Category')['Sales_Amount'].quantile([0.25, 0.5, 0.75])
print(f"\n按产品类别划分的销售额25th, 50th, 75th分位数:\n{multi_quantiles_by_category}")

输出结果会清晰地展示每个产品类别下销售额的分位数情况,这比看整体分位数要有用得多。

groupby().quantile()的强大之处在于,它能自动处理分组逻辑,并对每个组独立地应用分位数计算。你甚至可以对多个列进行分组,或者计算多个数值列的分位数,Pandas都能很好地支持。这种组合操作是Pandas在数据处理方面备受青睐的原因之一。在我看来,掌握groupby()是进行复杂数据分析的基石。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

78

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

32

2026.01.31

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

216

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

413

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

143

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

221

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号