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

为何Pandas.cut()返回列的dtype是interval[int64, right]而非默认object?

问题:为何age_processing__interval列的 dtype 是interval[int64, right]而非 object?

相关代码

def age_transformer(X):
    X_copy = X.copy()
    median_age_by_class = X_copy.groupby('Pclass')['Age'].median().reset_index()
    median_age_by_class.columns = ['Pclass', 'median_age']
    for index, row in median_age_by_class.iterrows():
        class_value = row['Pclass']
        median_age = row['median_age']
        X_copy.loc[X_copy['Pclass'] == class_value, 'Age'] = X_copy.loc[X_copy['Pclass'] == class_value, 'Age'].fillna(median_age)
    bins = [0, 10, 20, 30, 40, 50, 60, 70, 100]
    X_copy['age_interval'] = pd.cut(X_copy['Age'], bins=bins)
    return X_copy

def age_processor():
    return make_pipeline(
        FunctionTransformer(age_transformer, feature_names_out=interval_name),
    )

运行结果

列值统计

df['age_processing__interval'].value_counts()

age_processing__interval
(20, 30]     377
(30, 40]     185
(10, 20]     115
(40, 50]      86
(0, 10]       64
(50, 60]      42
(60, 70]      17
(70, 100]      5
Name: count, dtype: int64

列信息

df.info()
 1   age_processing__interval  891 non-null    interval[int64, right]

原因解析

这是因为 pandas 从1.0版本开始,pd.cut()默认返回**IntervalArray类型**的结果,而非旧版本中的object类型。

旧版本pandas里,pd.cut()生成的区间会以字符串形式存储在object列中;但1.0版本后,pandas引入了专门的Interval数据类型来处理区间数据,这种设计的优势包括:

  • 支持直接进行区间比较运算(比如判断数值是否落在区间内)
  • 内存占用更低
  • 完整保留区间的边界规则(比如你看到的right表示区间是右闭合的,int64是区间边界的数据类型)

如果需要回到object类型的区间列,可以在pd.cut()后添加类型转换:

X_copy['age_interval'] = pd.cut(X_copy['Age'], bins=bins).astype(str)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:32:35