如何在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
相关产品推荐
相关产品推荐

