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

如何在滚动序列中使用Pandas qcut函数?报错及输出需求

解决Pandas rolling.apply结合qcut的TypeError问题

我懂你碰到的这个坑了——rolling.apply() 默认要求函数返回数值类型,但 pd.qcut() 输出的是分类(Categorical)对象,这就直接触发了TypeError: must be real number, not Categorical错误。要得到你期望的区间字符串格式,只需要修改自定义函数,把Categorical转换为字符串即可。

解决方案代码

import pandas as pd

def my_func(values):
    # 将qcut返回的Categorical转为字符串格式的区间
    return pd.qcut(values, 2).astype(str)

s = pd.Series([1, 2, -0.1, -8.45, 10, 11, 2, 3])
# 设置raw=False,让函数接收Series而非numpy数组,处理更顺畅
z = s.rolling(2).apply(my_func, raw=False)

输出结果

运行后你会得到和预期一致的区间格式:

0                          NaN
1    [(0.999, 1.5], (1.5, 2.0]]
2    [(0.95, 2.0], (-0.101, 0.95]]
3    [(-4.275, -0.1], (-8.451, -4.275]]
4    [(-8.451, 0.775], (0.775, 10.0]]
5    [(9.999, 10.5], (10.5, 11.0]]
6    [(6.5, 11.0], (-0.5, 2.0]]
7    [(1.999, 2.5], (2.5, 3.0]]
dtype: object

关键说明

  • raw=False:默认rolling.apply()会把窗口数据转为numpy数组传入函数,设置raw=False后,函数会接收Series对象,更适配pd.qcut()的处理逻辑。
  • 如果后续需要数值型的分类标识(比如0/1),可以把函数改成返回pd.qcut(values, 2).codes,这样也能避免类型错误,同时得到可用于计算的数值结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:53