自定义平方和函数调用报错求助:pandas提示无可聚合数值类型
解决pandas rolling.apply平方和计算时的DataError问题
问题根源
- 现有
sum_of_squares函数逻辑错误:当前函数接收整数n计算1到n的平方和,但rolling.apply会把每个窗口的Series数据传入函数,而非整数参数,导致函数无法处理窗口内的实际数据。 - 数据类型不匹配:df2的列可能不是数值类型(比如object),pandas无法对非数值型数据执行聚合操作,触发
No numeric types to aggregate报错。
分步解决方案
1. 修正平方和函数
修改函数,使其接收窗口内的Series,计算每个元素的平方和:
def sum_of_squares(window_series): return (window_series ** 2).sum()
2. 确保数据为数值类型
先检查数据类型:
print(df2.dtypes)
如果列是object类型,转换为浮点型:
df2 = df2.astype(float)
若存在异常值(比如非数字字符串),用pd.to_numeric处理:
df2['ACCX'] = pd.to_numeric(df2['ACCX'], errors='coerce') df2['ACCY'] = pd.to_numeric(df2['ACCY'], errors='coerce') df2['ACCZ'] = pd.to_numeric(df2['ACCZ'], errors='coerce') # 可选:删除转换失败产生的NaN行 df2 = df2.dropna()
3. 执行滚动窗口计算
完成上述两步后,重新运行代码:
a_energy = df2.rolling(170, step=170).apply(sum_of_squares)
额外优化(推荐)
如果不需要自定义函数,直接用pandas内置方法组合,效率更高:
a_energy = df2.pow(2).rolling(170, step=170).sum()
这种方式避免了apply的性能开销,适合大数据量场景。
内容的提问来源于stack exchange,提问作者HalaM
相关产品推荐
相关产品推荐

