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

