2016-11-28 4 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

グループを使用してアクションを実行する列を指定するにはどうすればよいですか? – 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の10進数の後に精度を失います。 –

+0

方法1の結果は私に別の結果を与えています。 idscng_fビン 1 51 1.490116e-08 66 2.367480e-03 DTYPE:のfloat64 第二の方法は、私に必要な結果を与えるが、それは、円形のデータであるため、それは、他の角度のために働くのだろうか。 – ydopico

+0

ああ、私が 'np.nonzero'を含めたのは、他の要素の値が0になっていて、指定したダミーデータの値が1つだけだったからです。本当のものではないはずです。それがあなたに間違った結果を与えているなら、それを削除します。そして、そうです。第2のアプローチは、基本的には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

ニース!これも正しい結果をもたらします。以前は決して心を打たなかった。 –

関連する問題