Python中Pandas的describe()函数详解

describe()

在Python中,describe 通常不是一个内置函数或方法,但它是数据分析中常用的一个术语,特别是在使用Pandas库进行数据处理时。Pandas库提供了一个名为 describe() 的方法,用于生成DataFrame或Series的摘要统计信息。

基本描述

describe() 方法为DataFrame或Series中的数值列生成描述性统计信息,默认包括:

  • 计数(count)
  • 平均值(mean)
  • 标准差(std)
  • 最小值(min)
  • 25%分位数(25%)
  • 50%分位数(即中位数,50%)
  • 75%分位数(75%)
  • 最大值(max)
  • 对于对象类型(如字符串)或分类数据,describe() 方法默认会提供:

  • 计数(count)
  • 唯一值个数(unique)
  • 众数(top)
  • 众数出现的频率(freq)
  • 使用示例

    例子1:object

    你可以使用以下代码来创建一个DataFrame并调用 describe() 方法:

    import pandas as pd
     
    # 创建一个示例DataFrame
    data = {
        'A': [1, 2, 3, 4, 5],
        'B': [10, 20, 30, 40, 50],
        'C': ['a', 'b', 'c', 'a', 'b']
    }
    df = pd.DataFrame(data)
     
    # 对数值列生成描述性统计信息
    print(df.describe())
     
    # 对对象类型列生成描述性统计信息
    print(df.describe(include='object'))
    

    对于数值列的描述性统计信息:

    A          B
    count  5.000000   5.000000
    mean   3.000000  30.000000
    std    1.581139  15.811390
    min    1.000000  10.000000
    25%    2.000000  20.000000
    50%    3.000000  30.000000
    75%    4.000000  40.000000
    max    5.000000  50.000000
    

    对于对象类型列的描述性统计信息:

    C
    count   5
    unique  3
    top     a
    freq    2
    
    例子2:all

    使用include='all'的输出结果

    import pandas as pd
    import numpy as np
     
    # 创建DataFrame
    data = {
        'age': [23, 45, 56, np.nan, 78],
        'salary': [50000, 60000, 70000, 80000, 90000],
        'department': ['HR', 'Engineering', 'Marketing', 'Finance', 'Sales']
    }
    df = pd.DataFrame(data)
     
    # 使用include='all'获取所有列的描述性统计信息
    desc_all = df.describe(include='all')
    print(desc_all)
    

    输出结果可能如下(注意:由于实际输出可能会受到Pandas版本和显示设置的影响,以下输出是一个基于假设的示例):

    age        salary department
    count    4.000000      5.000000          5
    unique         NaN           NaN          5
    top            NaN           NaN    Finance
    freq           NaN           NaN          1
    mean    53.000000  70000.000000        NaN
    std     21.602469  15811.388374        NaN
    min     23.000000  50000.000000        NaN
    25%     34.000000  60000.000000        NaN
    50%     49.000000  70000.000000        NaN
    75%     67.000000  80000.000000        NaN
    max     78.000000  90000.000000        NaN
    

    但是,上面的输出并不准确,因为unique, top, 和 freq 这些统计量对于数值列来说是没有意义的,而且它们被错误地放在了整个DataFrame的输出中。实际上,当使用include='all'时,Pandas会分别为数值列和对象列生成两个独立的描述性统计表,并将它们合并在一起,但合并的方式可能不是直接将统计量放在同一行和列中。正确的输出应该更像下面这样(注意:这是手动合并的结果,实际输出可能会有所不同):

    数值列的描述性统计信息

    age        salary
    count    4.000000    5.000000
    mean    53.000000  70000.00000
    std     21.602469  15811.38837
    min     23.000000  50000.00000
    25%     34.000000  60000.00000
    50%     49.000000  70000.00000
    75%     67.000000  80000.00000
    max     78.000000  90000.00000
    

    对象列的描述性统计信息

    department
    count           5
    unique          5
    top      Finance
    freq            1
    

    这两个表通常不会直接合并成单个表格,而是分别显示,或者在某些情况下,可能会以不同的方式组织在一起。

    例子3:

    使用数据类型列表作为include参数的输出结果

    如果你只想要数值列的描述性统计信息,可以这样做:

    desc_numeric = df.describe(include=[np.number])
    print(desc_numeric)
    

    输出结果将只包含数值列(agesalary)的描述性统计信息,与上面数值列的描述性统计信息相同。

    如果你想要同时获取数值列和对象列的描述性统计信息(尽管对象列的统计信息可能不是很有用),可以这样做:

    python复制代码
    
    desc_numeric_and_object = df.describe(include=[np.number, 'object'])
    desc_numeric_and_object = df.describe(include=[np.number, 'object'])
    

    但是,请注意,这通常不是推荐的做法,因为对象列的统计信息对于数值分析来说通常不是很有用,而且可能会使输出结果变得混乱。在实际应用中,更常见的做法是分别获取数值列和对象列的描述性统计信息,并根据需要进行分析。

    自定义 describe()

    describe() 方法还允许你通过 percentiles 参数自定义分位数,通过 include 参数指定要包括的数据类型(如 allnumericobjectcategorical),以及通过 exclude 参数排除某些列。

    例如,自定义分位数:

    print(df.describe(percentiles=[.1, .9]))
    

    这将生成包含10%和90%分位数的统计信息。

    总之,Pandas的 describe() 方法是数据分析中非常有用的工具,可以快速获得数据的概览和统计信息。

    作者:yimoxi_no1

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中Pandas的describe()函数详解

    发表回复