2016-07-26 5 views
4

私はこの問題の非常に単純な解決策が必要であると確信していますが、私はそれを見つけることができませんでした(以前の質問からブラウズしていました。パンダの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です。しかし私はそれをすることができません。私はおそらくいくつかの非常にばかな間違いをしている(私はプログラマーではない、私は非常にuntalentですので、私と忍耐してください:))。ここで

は、これまでのコードである(私は違うことをしようと、しばらくの間、それをいじりてきたので、今、私はそれについて考えることを、私は、コードの一部の古い作品を残すことによって、いくつかのミスを導入している場合があります):

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値を選択しなかった...

は私明白な間違いがあります私が採用しなければならない方法や別の方法がありますか?ありがとう! DVALを計算するのに

答えて

3

(ここで使用する権利機能np.diffであるか有限差分によって手動で私が良く計算されたていた私は非常に役立つnumpyのドキュメントを見つけていないことだし、他のあまり重要な問題?。)次いで

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 

我々差(最初のものを除く)すべての列、列Xの差で除算し、各列にラムダ関数を適用する:/ dXを。

+0

これで別の問題が発生しました。私はいくつかの平滑化を行う必要があるかもしれません(xの元の0.5mの間隔から2mとしましょう)、微分の値はちょうどこのスケールで狂ってしまいます。私はscipy関数filtfiltとバターを見てきましたが、おそらく私はそれらを正しく使用していません...どのようにこのコードでそれらを実装するには?ありがとう。 – durbachit

+0

申し訳ありませんが、投稿ごとに1つの質問のみをお願いします。新しい質問を投稿してみてください。あなたが望むなら、この質問を参照することができます。 – Alexander

+0

さて、ありがとう、ありがとう。 – durbachit

関連する問題