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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:10:15