DF的标准差,pandas

6
例如,我有一个pandas DataFrame,它的样子如下:
a b c
1 2 3
4 5 6
7 8 9

我希望计算此数据框中所有值的标准差。函数df.std()将按列返回值。
当然,我可以创建以下代码:
sd = []
sd.append(list(df['a']))
sd.append(list(df['b']))
sd.append(list(df['c']))
numpy.std(sd)

是否有可能使用一些pandas函数来简化这个DF的代码并使其更加易懂?


1
可能是Pandas:计算整个数据框的平均值或标准差的重复问题。 - Jeff B
2个回答

5

df.values 返回一个包含 df 中数值的 NumPy 数组。你可以对该数组应用 np.std

In [52]: np.std(sd)
Out[52]: 2.5819888974716112

In [53]: np.std(df.values)
Out[53]: 2.5819888974716112

1
请查看我下面的答案,可能会出现非常不受欢迎的行为:请注意,numpypandas标准偏差函数对自由度有不同的假设。因此,各种方法可能无法在“显而易见”的计算上达成一致。以下是示例。 - 8one6
或者 df.values.std(),因为 values() 已经将 Pandas 数据框转换为了 NumPy 数组,所以方法链实际上是自动在 NumPy 中进行的。 - JohnE

4

如果您喜欢“将所有值制成向量,然后计算其标准差”的想法,则可以选择以下替代方法:

df.stack().std()

但需要注意的是,Pandas的std函数假定的分母(自由度)与NumPy的std函数不同,因此:

df = pd.DataFrame(np.arange(1, 10).reshape(3, 3), columns=list('abc'))
print np.std(df.values)
print df.stack().std()
print df.stack().std() * np.sqrt(8. / 9.)

产生如下结果:

2.58198889747
2.73861278753
2.58198889747

中间的数字不同!这不是打字错误!


好的观点。还要注意,pandas和numpy的std都有一个ddof参数,因此您可以使它们等效。 - JohnE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接