Pandas expanding窗口apply计算多百分位值报错如何解决?
解决pandas expanding窗口同时计算多个百分位的问题
报错原因
你原代码报错的核心原因是:np.nanpercentile传入多个百分位值组成的列表作为参数时,会返回一个一维数组,而pandas的expanding.apply()默认要求每个窗口的计算结果是单个标量,无法直接写入单列,因此会抛出维度不匹配的错误。
解决方法
方法一:单次计算全部百分位,合并回原表
仅需一次窗口遍历,计算效率更高,适合百分位数量多的场景,代码示例如下:
import numpy as np import pandas as pd a = np.random.rand(1000) df = pd.DataFrame(a, columns=['Data']) val = [25, 30] # 计算所有百分位,将每个窗口返回的数组拆分为多列 perc_df = df['Data'].expanding(min_periods=1).apply( lambda x: np.nanpercentile(x, val, interpolation='nearest'), raw=True ).apply(pd.Series) # 为新生成的百分位列命名 perc_df.columns = [f'{v}th_Perc' for v in val] # 将百分位结果合并到原DataFrame df = pd.concat([df, perc_df], axis=1)
方法二:遍历百分位逐个生成列
写法简单直观,适合百分位数量少的场景,代码示例如下:
import numpy as np import pandas as pd a = np.random.rand(1000) df = pd.DataFrame(a, columns=['Data']) val = [25, 30] # 逐个计算每个百分位,生成对应列 for v in val: df[f'{v}th_Perc'] = df['Data'].expanding(min_periods=1).apply( lambda x: np.nanpercentile(x, v, interpolation='nearest'), raw=True )
注意:建议仅针对需要计算的单列(如示例中的
df['Data'])执行expanding操作,避免对全表做无意义计算。
内容的提问来源于stack exchange,提问作者Thedudeabides
相关产品推荐
相关产品推荐

