2017-03-03 27 views
1

,我有以下格式的熊貓數據幀一組選定行的執行數學最有效的方法:什麼是在一個數據幀

Location| X | Y 
---------------- 
A1  | 1 | 2 
A1  | 2 | 3 
A2  | 1 | 1 
A2  | 2 | 3 
etc...many locations...many values 

我想在一個所有值的一階導數位置,並將其作爲X1附加到原始數據框。

Location| X | Y | X' 
-------------------- 
A1  | 1 | 2 | 
A1  | 2 | 3 | 
A2  | 1 | 1 | 
A2  | 2 | 3 | 
etc...many locations...many values 

什麼是最有效/最優雅的做法。我有一個看起來像這樣的方法:

1.)獲取所有獨特的位置。

2.)遍歷所有位置以獲得只匹配循環中位置的行。

grad_dict = {} 
for location in locations: 
    selected_rows = df.query('{0} == "{1}") 
    temp_df = np.gradient(selected_rows['X']) 
    grad_dict[location] = temp_df 

3)串連所有字典在一起有點像這樣:

result = pd.concat([grad_dict[location] for location in locations]) 

注:有可能與此代碼的一些小問題,我好像沒有真正加入這個值數據框當前。但更廣泛的一點是我的問題。

我的問題:這是最優雅/有效的方式嗎?有沒有更優雅/更快的方式?當有許多地點時,此操作有時可能需要幾秒鐘的時間。

回答

1

如果我理解正確的話,你應該能夠執行groupby和使用transform

df["X'"] = df.groupby('Location')['X'].transform(np.gradient) 

在一般情況下,如果要執行一個數據幀的多個小節相同的操作,groupby是這樣的去。

輸出結果:

Location X Y X' 
0  A1 1 2 1 
1  A1 2 3 1 
2  A2 1 1 1 
3  A2 2 3 1 

編輯

如果你要提供額外的參數np.gradient,您可以提供它們作爲參數傳入transform。例如:

df["X'"] = df.groupby('Location')['X'].transform(np.gradient, 0.5, edge_order=2) 

如果您需要做更復雜的東西,你可以寫,而不是一個lambda函數來指定你想要做什麼,或者單獨定義自定義函數,並把它傳遞給transform。儘管如此,如果可以這樣做,您應該使用上述方法,因爲創建lambda會稍微慢一些:

df["X'"] = df.groupby('Location')['X'].transform(lambda x: np.gradient(x, 0.5, edge_order=2)) 
+0

那麼快的聖牛!答案几乎是瞬間的!我的意思是說,對於問題的回答速度以及代碼執行的速度有多快!只是一個後續問題:我在向漸變函數中添加參數時遇到困難。例如,如果我想將步驟更改爲0.5而不是1(默認值),或者如果我想設置edge_order = 1 ...我該怎麼做? – Thornhale

+0

只是回答我自己的問題:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.GroupBy.transform.html – Thornhale

+0

編輯,以解決您的意見(它看起來像你的想法已經出來),所以未來的讀者有一個自足的答案。 – root