You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中用describe()获取有序分类数据的最值?

解决方案:让describe()展示有序分类数据的min/max

当然可以实现!Pandas 默认的 describe() 方法对有序分类数据只会输出 count、unique、top、freq 这几个统计量,不会自动包含 min 和 max,但我们可以通过自定义统计逻辑来扩展它,下面给你两种实用的解决方案:

方案1:手动合并分类数据的min/max到describe结果

这种方法适合一次性使用,直接提取数值型数据的默认describe结果,再补充有序分类的min和max统计量:

import pandas as pd
from pandas.api.types import CategoricalDtype

# 先模拟你的数据场景(如果已有数据可跳过)
data_clean = pd.DataFrame({
    'indiv1': ['B', 'A', 'F', 'C', 'D'],
    'numeric_col': [10, 20, 30, 40, 50]
})
# 设置有序分类(和你的代码逻辑一致)
data_clean.indiv1 = data_clean.indiv1.astype(CategoricalDtype(categories=['F', 'D', 'C', 'B', 'A'], ordered=True))

# 1. 获取数值型数据的默认describe结果
num_desc = data_clean.describe()

# 2. 处理有序分类数据:提取需要的统计量
cat_cols = data_clean.select_dtypes(include='category')
cat_stats = []
for col in cat_cols.columns:
    # 获取默认分类统计(count/unique/top/freq)
    col_default = cat_cols[col].describe()
    # 添加min和max
    col_default['min'] = cat_cols[col].min()
    col_default['max'] = cat_cols[col].max()
    cat_stats.append(col_default)

# 3. 转换为DataFrame并合并数值型结果
cat_desc = pd.concat(cat_stats, axis=1)
full_desc = pd.concat([num_desc, cat_desc])

# 4. 调整统计项的顺序,和默认describe保持一致
desired_order = ['count', 'unique', 'top', 'freq', 'mean', 'std', 'min', '25%', '50%', '75%', 'max']
full_desc = full_desc.loc[[row for row in desired_order if row in full_desc.index]]

print(full_desc)

运行后,你会看到indiv1列的结果里包含了min(F)和max(A),和数值型数据的统计量整合在一起。

方案2:自定义DataFrame扩展方法(适合重复使用)

如果需要多次调用这个功能,可以给DataFrame注册一个自定义的访问器,封装逻辑,方便后续直接调用:

import pandas as pd
from pandas.api.extensions import register_dataframe_accessor
from pandas.api.types import CategoricalDtype

# 注册自定义访问器
@register_dataframe_accessor("custom_desc")
class OrderedCatDescribe:
    def __init__(self, df_obj):
        self._df = df_obj
    
    def include_ordered_cat(self):
        # 分离数值型和分类型数据
        num_df = self._df.select_dtypes(exclude='category')
        cat_df = self._df.select_dtypes(include='category')
        
        # 获取数值型默认describe
        num_desc = num_df.describe()
        
        # 处理分类数据:有序分类补充min/max,无序分类用默认统计
        cat_results = {}
        for col in cat_df.columns:
            col_series = cat_df[col]
            col_desc = col_series.describe()
            if col_series.dtype.ordered:
                col_desc['min'] = col_series.min()
                col_desc['max'] = col_series.max()
            cat_results[col] = col_desc
        
        # 合并结果并调整顺序
        cat_desc = pd.DataFrame(cat_results)
        full_desc = pd.concat([num_desc, cat_desc])
        
        desired_order = ['count', 'unique', 'top', 'freq', 'mean', 'std', 'min', '25%', '50%', '75%', 'max']
        full_desc = full_desc.loc[[row for row in desired_order if row in full_desc.index]]
        
        return full_desc

# 使用示例
data_clean = pd.DataFrame({
    'indiv1': ['B', 'A', 'F', 'C', 'D'],
    'indiv2': ['X', 'Y', 'X', 'Z', 'Y'],  # 无序分类示例
    'numeric_col': [10, 20, 30, 40, 50]
})
data_clean.indiv1 = data_clean.indiv1.astype(CategoricalDtype(categories=['F', 'D', 'C', 'B', 'A'], ordered=True))
data_clean.indiv2 = data_clean.indiv2.astype(CategoricalDtype(categories=['X', 'Y', 'Z'], ordered=False))

# 直接调用自定义方法
print(data_clean.custom_desc.include_ordered_cat())

这个方法会自动区分有序/无序分类:有序分类会补充min和max,无序分类则保持默认的统计量,非常灵活。


内容的提问来源于stack exchange,提问作者user3566180

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:20:57