2016-07-26 203 views
4

我相信這個問題肯定有一個非常簡單的解決方案,但我無法找到它(並瀏覽以前提出的問題,我沒有找到我想要的或不明白的答案)。如何獲取Pandas DataFrame中的值的索引?

我有一個類似的數據幀(只是更大,還有更多的行和列):

 x val1 val2 val3 
0 0.0 10.0 NaN NaN 
1 0.5 10.5 NaN NaN 
2 1.0 11.0 NaN NaN 
3 1.5 11.5 NaN 11.60 
4 2.0 12.0 NaN 12.08 
5 2.5 12.5 12.2 12.56 
6 3.0 13.0 19.8 13.04 
7 3.5 13.5 13.3 13.52 
8 4.0 14.0 19.8 14.00 
9 4.5 14.5 14.4 14.48 
10 5.0 15.0 19.8 14.96 
11 5.5 15.5 15.5 15.44 
12 6.0 16.0 19.8 15.92 
13 6.5 16.5 16.6 16.40 
14 7.0 17.0 19.8 18.00 
15 7.5 17.5 17.7 NaN 
16 8.0 18.0 19.8 NaN 
17 8.5 18.5 18.8 NaN 
18 9.0 19.0 19.8 NaN 
19 9.5 19.5 19.9 NaN 
20 10.0 20.0 19.8 NaN 

在下一步驟中,我需要計算導數DVAL/DX針對每個值的列(實際上我有3列以上,所以我需要在循環中有一個強大的解決方案,我不能每次手動選擇行)。但是由於某些列的NaN值,我正面臨着x和val不是同一維度的問題。我覺得解決這個問題的方法是隻選擇x的區間,其中val是notnull。但我無法做到這一點。我可能犯了一些非常愚蠢的錯誤(我不是程序員,我非常無能,所以請耐心等待:))。

這是目前爲止的代碼(現在我想到了,我可能因爲遺留了一些舊代碼而導致了一些錯誤,因爲我已經搞了一會兒,嘗試了不同的事情):

import pandas as pd 
import numpy as np 

df = pd.read_csv('H:/DocumentsRedir/pokus/dataframe.csv', delimiter=',') 

vals = list(df.columns.values)[1:] 

for i in vals: 
    V = np.asarray(pd.notnull(df[i])) 

    mask = pd.notnull(df[i]) 
    X = np.asarray(df.loc[mask]['x']) 

    derivative=np.diff(V)/np.diff(X) 

但我收到此錯誤:

ValueError: operands could not be broadcast together with shapes (20,) (15,) 

所以,很明顯,它沒有選擇只有NOTNULL值...

是否有一個明顯的錯誤,我一個我應該採用哪種方式或採取不同的方法?謝謝!

(而另一個同樣重要的問題:是np.diff右功能用在這裏或曾有我最好用有限差分人工計算它我沒有找到numpy的文件非常有用嗎?)。

回答

3

要計算DVAL/DX:

dVal = df.iloc[:, 1:].diff() # `x` is in column 0. 
dX = df['x'].diff() 
>>> dVal.apply(lambda series: series/dX) 

    val1 val2 val3 
0 NaN NaN NaN 
1  1 NaN NaN 
2  1 NaN NaN 
3  1 NaN NaN 
4  1 NaN 0.96 
5  1 NaN 0.96 
6  1 15.2 0.96 
7  1 -13.0 0.96 
8  1 13.0 0.96 
9  1 -10.8 0.96 
10  1 10.8 0.96 
11  1 -8.6 0.96 
12  1 8.6 0.96 
13  1 -6.4 0.96 
14  1 6.4 3.20 
15  1 -4.2 NaN 
16  1 4.2 NaN 
17  1 -2.0 NaN 
18  1 2.0 NaN 
19  1 0.2 NaN 
20  1 -0.2 NaN 

我們差的所有列(除了第一個),然後應用lambda函數,其通過在X列中的差異除以它的每一列。

+0

好吧,現在我意識到了另一個問題。我可能需要做一些平滑處理(假設距離x的最初0.5米距離處的2米),衍生物的值就會在這個尺度上變得瘋狂。我見過scipy函數filtfilt和黃油,但可能我沒有正確使用它們......如何在此代碼中實現它們?謝謝。 – durbachit

+0

對不起,但你應該只問每個職位一個問題。嘗試發佈一個新問題。如果你願意,你可以參考這個問題。 – Alexander

+0

好的,完成了,謝謝。 – durbachit

相關問題