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

Pandas中groupby+rolling+apply转列表报错:TypeError问题求助

解决pandas分组滚动窗口转列表的TypeError问题

你的代码报错是因为pandas的rolling.apply()要求传入的函数必须返回单个标量值,而你返回的是列表,不符合它的输出要求,所以抛出了must be real number, not list的错误。

下面给两种可行的解决办法:

方法一:使用rolling().agg(list)(推荐,pandas 1.3.0+支持)

直接用agg方法指定聚合为列表,不需要自定义lambda,更简洁:

import pandas as pd

df = pd.DataFrame({
'sales': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
'tag': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C']})

result = df.groupby('tag')['sales'].rolling(4).agg(list).reset_index()
print(result)

输出结果里,窗口不足4的组(比如tag A只有3条数据)会显示NaN,符合滚动窗口的默认行为。

方法二:自定义处理每组的滚动窗口(兼容旧版本pandas)

如果你的pandas版本较低,不支持agg(list),可以在分组后对每组单独处理,通过窗口的索引切片获取对应数据转列表:

import pandas as pd

df = pd.DataFrame({
'sales': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
'tag': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C']})

def rolling_list(series, window):
    return [series.iloc[i-window:i].tolist() if i >= window else None 
            for i in range(1, len(series)+1)]

result = df.groupby('tag')['sales'].apply(lambda x: rolling_list(x, 4)).explode().reset_index()
result.columns = ['tag', 'level_1', 'rolling_sales']
print(result)

这个方法手动遍历每个位置,生成对应窗口的列表,不足窗口大小的位置返回None,和默认滚动行为一致。

内容的提问来源于stack exchange,提问作者苏世杰

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:12:48