gpt4 book ai didi

python - groupby 对象与 pandas 中的标准差计算结果令人困惑

转载 作者:行者123 更新时间:2023-12-01 00:20:34 26 4
gpt4 key购买 nike

假设数据框具有 namecategoryrank 列,其中 name 是一个个体,category是一个分类变量,rank是个体在一行中的排名。

首先,我想要每个名称类别的平均值:

X = df.groupby(['name','category'])['rank'].agg('mean')
#out:
+---------+-------------------+------+
| name | category | |
+---------+-------------------+------+
| 1260229 | 9 | 11.0 |
| | 18 | 9.50 |
| 1126191 | 5 | 4.00 |
| | 17 | 3.00 |
| | 23 | 4.00 |
| 1065670 | 33 | 3.00 |
| | 39 | 5.00 |
| | 41 | 8.00 |
+---------+-------------------+------+

现在是标准差,

X.reset_index().groupby('name')['rank'].agg(np.std)
#out:
+---------+------+
| name | |
+---------+------+
| 1260229 | 1.06 |
| 1126191 | 0.58 |
| 1065670 | 2.51 |
+---------+------+
#Note here that "rank" is actually the mean of rank by category. I just didn't change the name
#of the column for the new dataframe issued from X.reset_index()

问题是当我计算(对于单个 1260229)为 np.std([11,9.50]) 时,它返回 0.75而不是 1.06,其他人也有同样的问题。

我不明白哪里是错误的操作导致了这些错误的结果。

<小时/>

Pandas 版本:0.23.4Python版本:3.7.4

最佳答案

在pandas中默认为DataFrame.std中的ddof=1 ,在 numpy numpy.std0

您可以仅使用第二个 groupby stdlevel=0 参数来简化解决方案:

s = X.std(level=0)
print (s)
name
1260229 1.060660
1126191 0.577350
1065670 2.516611
Name: rank, dtype: float64

s = X.std(level=0, ddof=1)
print (s)
name
1260229 1.060660
1126191 0.577350
1065670 2.516611
Name: rank, dtype: float64

还有ddof=0:

s = X.std(level=0, ddof=0)
print (s)
name
1260229 0.750000
1126191 0.471405
1065670 2.054805
Name: rank, dtype: float64

如果想使用groupby也是可以的:

s = X.groupby(level=0, sort=False).std(ddof=0)
print (s)
name
1260229 0.750000
1126191 0.471405
1065670 2.054805
Name: rank, dtype: float64

关于python - groupby 对象与 pandas 中的标准差计算结果令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58995683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com