相关疑难解决方法(0)

Pandas:为什么pandas.Series.std()与numpy.std()不同

另一个更新:已解决(请参阅评论和我自己的答案).

更新:这是我想解释的.

>>> pd.Series([7,20,22,22]).std()
7.2284161474004804
>>> np.std([7,20,22,22])
6.2599920127744575
Run Code Online (Sandbox Code Playgroud)

答案:贝塞尔的校正解释了这一点,N-1而不是N标准差公式的分母.我希望熊猫使用与numpy相同的约定.


有一个相关的讨论在这里,但他们的建议都不能工作.

我有很多不同餐厅的数据.这是我的数据框(想象不止一个餐厅,但效果只用一个复制):

>>> df
restaurant_id  price
id                      
1           10407      7
3           10407     20
6           10407     22
13          10407     22
Run Code Online (Sandbox Code Playgroud)

问题:r.mi.groupby('restaurant_id')['price'].mean()每家餐厅的退货价格均值.我想获得标准偏差.但是,r.mi.groupby('restaurant_id')['price'].std() 返回错误的值.

正如您所看到的,为简单起见,我只提取了一个有四个项目的餐厅.我想找到价格的标准差.只想确认一下:

>>> np.mean([7,20,22,22])
17.75
>>> np.std([7,20,22,22])
6.2599920127744575
Run Code Online (Sandbox Code Playgroud)

我们可以得到相同(正确)的值

>>> np.mean(df)
restaurant_id    10407.00
price               17.75
dtype: float64
>>> np.std(df)
restaurant_id    0.000000
price            6.259992
dtype: float64
Run Code Online (Sandbox Code Playgroud)

(当然,无视平均餐厅的身份.)显然,np.std(df)当我有一家以上的餐厅时,这不是一个解决方案.所以我正在使用groupby.

>>> df.groupby('restaurant_id').agg('std')
                  price
restaurant_id          
10407          7.228416
Run Code Online (Sandbox Code Playgroud)

什么?!7.228416不是6.259992.

让我们再试一次.

>>> …
Run Code Online (Sandbox Code Playgroud)

python statistics group-by numpy pandas

10
推荐指数
1
解决办法
8168
查看次数

ValueError:缓冲区dtype不匹配,预期'float64_t'但得到'浮动'

有一个DataFrame'modtso':

In [4]: modtso
Out[4]: 
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 74006 entries, 2002-07-27 15:00:00 to 2010-12-31 22:58:08
Data columns:
0    74006  non-null values
dtypes: float32(1)

In [5]: modtso[1:10]
Out[5]: 
                         0
2002-07-27 16:01:53   9.336845
2002-07-27 16:58:08   9.337487
2002-07-27 18:00:00   9.343308
2002-07-27 19:01:53   9.364368
2002-07-27 19:58:08   9.389445
...
Run Code Online (Sandbox Code Playgroud)

现在我想重新取样如下:

a=modtso.resample('D',how='std')
Run Code Online (Sandbox Code Playgroud)

它会引发异常:

ValueError: Buffer dtype mismatch, expected 'float64_t' but got 'float'
Run Code Online (Sandbox Code Playgroud)

有什么问题?我该怎么解决?谢谢

python pandas

5
推荐指数
1
解决办法
9295
查看次数

Python Pandas:使用Aggregate与Apply来定义新列

假设我有一个像这样的数据帧:

n = 20
dim1 = np.random.randint(1, 3, size=n)
dim2 = np.random.randint(3, 5, size=n)
data1 = np.random.randint(10, 20, size=n)
data2 = np.random.randint(1, 10, size=n)
df = pd.DataFrame({'a': dim1, 'b': dim2 ,'val1': data1, 'val2': data2})
Run Code Online (Sandbox Code Playgroud)

如果我定义一个返回分组的函数:

def h(x):
    if x['val2'].sum() == 0:
        return 0
    else:
        return (x['val1'].sum())*1.0/x['val2'].sum()*1.0
Run Code Online (Sandbox Code Playgroud)

按列之一进行分组并聚合返回结果:

df.groupby(['a']).aggregate(h)['val1']
Run Code Online (Sandbox Code Playgroud)

虽然它将所有现有列转换为所需结果,而不是添加新列

使用聚合时,按两列分组会导致错误:

df.groupby(['a','b']).aggregate(h)['val1']

KeyError: 'val2'
Run Code Online (Sandbox Code Playgroud)

但转换聚合申请似乎有效.

我有两个问题:

  1. 为什么应用工作而不是聚合?
  2. 如果在通过某组键对数据帧进行分组后,我想使用将组值聚合为新列的函数,那么最好的方法是什么?

提前致谢.

python pandas

5
推荐指数
1
解决办法
2026
查看次数

标签 统计

pandas ×3

python ×3

group-by ×1

numpy ×1

statistics ×1