如何在滚动序列中使用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
相关产品推荐
相关产品推荐

