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

不錯!這也給出了正確的結果。以前從未打動過我。 –