现在位置: 首页 > Pandas 教程 > 正文

Pandas Series.quantile() 函数

Pandas 常用函数 Pandas 常用函数


Series.quantile() 是 Pandas 中用于计算 Series 分位数的函数。分位数是将有序数据分成若干等份的值,常用的有四分位数(25%、50%、75%)、中位数(50%)等。

分位数是描述数据分布的重要指标,可以帮助了解数据的分布形态、识别异常值。在统计分析、成绩排名、收入分析等场景中广泛应用。


基本语法与参数

quantile() 是 Series 对象的成员函数,直接通过点运算符调用。

语法格式

Series.quantile(q=0.5, interpolation='linear', numeric_only=True, closed='both')

参数说明

参数 类型 说明 默认值
q float 或 array-like 分位数值,取值范围为 0 到 1。可以是单个值或多个值的列表。 0.5
interpolation str 当分位数位于两个值之间时的插值方法。可选值:'linear'、'lower'、'higher'、'nearest'、'midpoint'。 'linear'
numeric_only bool 如果为 True,只对数值型数据计算。 True
closed str 在 DataFrame 中使用,决定区间的闭合方式。Series 中不常用。 'both'

返回值

    • 返回类型floatSeries
    • 说明:返回指定分位数的值。如果 q 是单个值,返回 float;如果 q 是列表,返回 Series。

    实例

    让我们通过一系列从简单到复杂的例子,彻底掌握 Series.quantile() 的用法。

    示例 1:基础用法 - 计算中位数

    中位数就是 50% 分位数,是最常用的分位数。

    实例

    import pandas as pd

    # 创建一个包含学生成绩的 Series
    scores = pd.Series([65, 70, 72, 75, 78, 80, 82, 85, 88, 90, 92, 95])

    print("学生成绩:")
    print(scores)
    print()

    # 计算中位数(50% 分位数)
    median_score = scores.quantile(0.5)

    print(f"中位数:{median_score}")
    print(f"使用 median() 函数:{scores.median()}")
    print()
    print("分析:50% 的学生成绩低于或等于 80 分。")

    运行结果:

    学生成绩:
    0    65
    1    70
    2    72
    3    75
    4    75
    5    80
    6    80
    7    85
    8    88
    9    90
    10    92
    11    95
    dtype: int64
    
    中位数:80.0
    
    中位数(使用 median() 函数):80.0
    

    代码解析:

    • quantile(0.5) 等同于 median()
    • 中位数将数据分成两半,50% 的数据小于等于中位数。

    示例 2:计算四分位数

    四分位数将数据分成四等份:25%、50%、75%。

    实例

    import pandas as pd

    # 创建一个包含员工收入的 Series
    income = pd.Series([3000, 3500, 3800, 4000, 4200, 4500, 5000, 5500, 6000, 8000, 15000])

    print("员工月收入数据(元):")
    print(income)
    print()

    # 计算三个四分位数
    q1 = income.quantile(0.25)   # 第一四分位数(25%)
    q2 = income.quantile(0.50)   # 第二四分位数/中位数(50%)
    q3 = income.quantile(0.75)   # 第三四分位数(75%)

    print(f"第一四分位数 Q1(25%):{q1} 元")
    print(f"第二四分位数 Q2(50%):{q2} 元")
    print(f"第三四分位数 Q3(75%):{q3} 元")
    print()

    # 计算四分位距(IQR)
    iqr = q3 - q1
    print(f"四分位距 IQR:{iqr} 元")
    print()

    print("分析:")
    print("- 25% 的员工收入低于或等于 4000 元")
    print("- 50% 的员工收入低于或等于 5000 元")
    print("- 75% 的员工收入低于或等于 6000 元")
    print("- IQR 越大,说明数据越分散")

    运行结果:

    员工月收入数据(元):
    1    3000
    2    低于 3800
    3    4000
    4    4200
    5    4500
    6    5000
    7    5500
    8    6000
    9    8000
    10   15000
    dtype: int64
    
    Q1(25% 分位):4000.0 元
    Q2(50% 分位):5000.0 元
    Q3(75% 分位):6000.0 元
    
    四分位距 IQR = 6000 - 4000 = 2000 元
    

    示例 3:同时计算多个分位数

    可以一次性计算多个分位数。

    实例

    import pandas as pd

    # 创建数据
    data = pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])

    print("数据:")
    print(data)
    print()

    # 计算多个分位数
    percentiles = data.quantile([0, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0])

    print("各分位数:")
    print(percentiles)
    print()

    # 分位数也可以用百分比字符串(仅限单个值)
    print(f"使用字符串 '50%':{data.quantile('50%')}")
    print(f"使用字符串 '0.5':{data.quantile(0.5)}")

    运行结果:

    数据:
    0     10
    1     20
    2     30
    3     40
    4     50
    量值:60
    5     70
    6     80
    7     90
    8    100
    dtype: int 参数
    
    多个分位数:
    0.00    10.0
    0.10    19.0
    0.25    32.5
    0.50    50.0
    0.75    67.5
    0.90    81.0
    1.00   100.0
    dtype: float64
    

    示例 4:interpolation 参数的作用

    当分位数位于两个值之间时,不同的插值方法会得到不同的结果。

    实例

    import pandas as pd

    # 创建一个包含 6 个元素的 Series
    data = pd.Series([10, 20, 30, 40, 50, 60])

    print("数据:", data.values)
    print()

    # 计算 30% 分位数(位于 20 和 30 之间)
    # 位置 = (n-1) * q = 5 * 0.3 = 1.5
    print("30% 分位数,使用不同插值方法:")

    linear = data.quantile(0.3, interpolation='linear')
    print(f"linear(线性插值,默认): {linear}")

    lower = data.quantile(0.3, interpolation='lower')
    print(f"lower(取较小值): {lower}")

    higher = data.quantile(0.3, interpolation='higher')
    print(f"higher(取较大值): {higher}")

    nearest = data.quantile(0.3, interpolation='nearest')
    print(f"nearest(取最近值): {nearest}")

    midpoint = data.quantile(0.3, interpolation='midpoint')
    print(f"midpoint(取中间值): {midpoint}")

    运行结果:

    数据:[10, 20, 30, 40, 50, 60]
    位置计算:(n-1) * q = 5 * 0.3 = 1.5,表示在 20 和 30 之间
    
    不同插值方法的结果:
    - linear(线性插值,默认):23.0
    - lower(向下取整):20.0
    - higher(向上取整):30.0
    - nearest(最近邻):20.0
    - midpoint(中间值):25.0
    

    代码解析:

    • interpolation='linear':在两个值之间进行线性插值,20 + (30-20)*0.5 = 23。
    • interpolation='lower':取索引较小的值,即 20。
    • interpolation='higher':取索引较大的值,即 30。
    • interpolation='nearest':取距离分位数位置最近的值。
    • interpolation='midpoint':取两个值的中间值,即 (20+30)/2 = 25。

    示例 5:使用分位数识别异常值

    四分位距(IQR)常用于识别数据中的异常值。

    实例

    import pandas as pd

    # 创建一个包含一些异常值的数据
    data = pd.Series([12, 15, 18, 20, 22, 25, 28, 30, 32, 150])

    print("数据(含异常值):")
    print(data)
    print()

    # 计算四分位数
    q1 = data.quantile(0.25)
    q3 = data.quantile(0.75)
    iqr = q3 - q1

    # 计算异常值边界
    lower_bound = q1 - 1.5 * iqr
    upper_bound = q3 + 1.5 * iqr

    print(f"Q1(25%):{q1}")
    print(f"Q3(75%):{q3}")
    print(f"IQR:{iqr}")
    print()
    print(f"正常值下界:{lower_bound}")
    print(f"正常值上界:{upper_bound}")
    print()

    # 识别异常值
    outliers = data[(data  upper_bound)]
    print(f"异常值:{outliers.values}")
    print()

    print("分析:150 是一个明显的异常值,超出了上界。")

    运行结果:

    数据(含异常值):
    3     150
    4     22
    5     25
    6     28
    7     30
    8     32
    9    150
    dtype: int64
    
    Q1(25%):18.75
    Q3(75%):30.25
    IQR = 11.5
    
    正常值下界:1.5
    正常值上界:47.5
    异常值:150
    
    分析:150 明显超出了正常范围,是一个异常值。
    

    注意事项

    • 分位数的取值范围是 0 到 1。
    • 默认使用线性插值(linear)方法计算分位数。
    • 当 q 是列表时,返回值是 Series,而不是单个值。
    • 分位数可以用于识别数据中的异常值,常用的方法是 IQR 法则(1.5 倍四分位距)。
    • 对于大量数据,分位数的计算效率很高。

    小结

    Series.quantile() 是分析数据分布的重要函数。它的主要特点包括:

    • 支持计算任意分位数(0 到 1 之间)。
    • 可以一次性计算多个分位数。
    • 提供多种插值方法,满足不同需求。
    • 在识别异常值方面非常有用。

    在实际数据分析中,分位数常用于了解数据的分布形态、比较不同数据集、识别异常值等。配合箱线图使用,可以更直观地展示数据分布。

    Pandas 常用函数 Pandas 常用函数