2016-11-28 68 views
1

我是python的新手,我试图找到一些循环数据(风向)的std,通过一些特征对数据进行分组。 这是我使用的一组df。groupby申请不给预期结果

Profile bin  inflow_direction 
0 1  51  331.7 
1 1  51  332.8 
2 1  51  334.1 
3 1  51  335.4 
4 1  51  336.4 
5 1  66  337.3 
6 1  66  337.5 
7 1  66  337.6 
8 1  66  337.7 
9 1  66  337.6 

我需要在每个配置文件内的每组bin的std。 我已经定义了STD功能:

def circstd(j) : samples = np.radians (j) return scipy.stats.circstd(samples, high=6.283185307179586, low=0, axis=None)

当我组:

df.groupby(['Profile','bin']).apply(circstd) 

的的是:

idscng_f bin 
1   51  0.567811 

      66  0.671470 

但我期待

idscng_f bin 
1   51  0.0296 

      66  0.0025 

这里有什么问题?

+0

尝试指定在其上作用是将要执行的列? +在同一步骤中转换为弧度会使事情变得复杂。将这两样东西分开,让它起作用,理解它,然后将它们合并回来,如果你想要 –

+0

我该如何指定 - 使用group by - 要执行动作的列? – ydopico

+0

请参阅下面@Nickil Maveli的答案方法1。 –

回答

1

使用np.std从度转换角度为弧度后:

def simple_circstd(j) : 
    return np.std(np.radians(j))['inflow_direction'] 

执行Groupby

df.groupby(['Profile','bin']).apply(simple_circtd) 

获得的输出所得到的:

Profile bin 
1  51  0.029650 
     66  0.002367 
dtype: float64 
+0

你的意思是精度。它大部分在3/4十进制数字后丢失精度。 –

+0

方法1的结果给了我不同的结果。 idscng_f仓 1 51 1.490116e-08 66 2.367480e-03 D型细胞:float64 第二种方法给我所需要的结果,但我不知道是否会为其它角度工作,因为它是圆形的数据。 – ydopico

+0

哦,我把'np.nonzero'包括在内的原因是因为我为其他元素获取了零值,而您提供的虚拟数据只有一个有限值。一定不是真正的情况。我会删除它,如果它给你不正确的结果。是的,第二种方法将工作,因为它基本上从deg转换为rad,并在圆形阵列上计算'std'。 –

1

可以指定SeriesGroupBy对象使用apply()

df.groupby(['Profile','bin'])["inflow_direction"].apply(circstd) 会做这项工作。

输出:

Profile bin 
1  51  0.029650 
     66  0.002367 
Name: inflow_direction, dtype: float64 
+0

不错!这也给出了正确的结果。以前从未打动过我。 –