如何为DataFrame生成所有列的扩展标准差(std)列?
问题解决:为DataFrame添加全局扩展标准差列
错误原因分析
你写的代码df['std'] = df.reset_index().groupby('day').expanding().std()存在两个核心问题:
groupby('day')会把每一天的数据单独分成一组,每组仅包含一行数据,expanding()在这里无法实现“从第一天到当前天”的累积计算;- 分组后返回的结果索引结构和原DataFrame不匹配,导致无法直接赋值到新列,触发
TypeError。
正确实现方案
要实现“从第一天到当前天的所有列元素的总体标准差”,需要利用expanding()窗口,对每个窗口内的所有数据进行扁平化处理后计算标准差(注意使用numpy.std并设置ddof=0,匹配你给出的示例结果,因为pandas.std默认是样本标准差,ddof=1)。
完整代码
import numpy as np import pandas as pd # 构建你的示例DataFrame df = pd.DataFrame( {'a': [2, 1, 7, 2, 4], 'b': [2, 2, 2, 9, 6], 'c': [8, 2, 3, 7, 4]}, index=pd.Index([1, 2, 3, 4, 5], name='day') ) # 计算全局扩展标准差并新增列 df['std'] = df.expanding().apply( lambda window: np.std(window.values.flatten(), ddof=0), raw=False ) print(df)
输出结果
a b c std day 1 2 2 8 2.828427 2 1 2 2 2.339278 3 7 2 3 2.346524 4 2 9 7 2.782635 5 4 6 4 2.542090
关键说明
expanding()会生成从第一行到当前行的累积窗口;window.values.flatten()将窗口内的二维数据转为一维数组,确保计算所有元素的标准差;ddof=0指定计算总体标准差,和你示例中numpy.std的默认行为一致。
内容的提问来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

