2017-05-10 17 views
0

私は可変数の列のpandasデータフレームを持っています。私は数値的にデータフレームの各列を統合して、行0から行 'n'までの積分を評価できるようにしたいと思います。私は1D配列で動作する関数を持っていますが、pandasデータフレームでこれを行うより良い方法がありますので、列やセルを反復処理する必要はありません。私はapplymapを使う方法を考えていましたが、それを動作させる方法がわかりません。python pandasデータフレームにおける明確な数値の統合

これは、1次元配列上で動作機能である:

def findB(x,y): 

     y_int = np.zeros(y.size) 
     y_int_min = np.zeros(y.size) 
     y_int_max = np.zeros(y.size) 
     end = y.size-1 

     y_int[0]=(y[1]+y[0])/2*(x[1]-x[0]) 

     for i in range(1,end,1): 
      j=i+1 
      y_int[i] = (y[j]+y[i])/2*(x[j]-x[i]) + y_int[i-1] 

     return y_int 

私は、すべてを一度にこのような何かをデータフレームの複数の列を算出し、何かに置き換えるしたいと思います:

B_df = y_df.applymap(integrator) 

EDIT:

開始データフレームdB_df:

 Sample1 1 dB Sample1 2 dB Sample1 3 dB Sample1 4 dB Sample1 5 dB Sample1 6 dB 
    0 2.472389 6.524537 0.306852 -6.209527 -6.531123 -4.901795 
    1 6.982619 -0.534953 -7.537024 8.301643 7.744730 7.962163 
    2 -8.038405 -8.888681 6.856490 -0.052084 0.018511 -4.117407 
    3 0.040788 5.622489 3.522841 -8.170495 -7.707704 -6.313693 
    4 8.512173 1.896649 -8.831261 6.889746 6.960343 8.236696 
    5 -6.234313 -9.908385 4.934738 1.595130 3.116842 -2.078000 
    6 -1.998620 3.818398 5.444592 -7.503763 -8.727408 -8.117782 
    7 7.884663 3.818398 -8.046873 6.223019 4.646397 6.667921 
    8 -5.332267 -9.163214 1.993285 2.144201 4.646397 0.000627 
    9 -2.783008 2.288842 5.836786 -8.013618 -7.825365 -8.470759 

エンディングデータフレームB_df:上記の例で

 Sample1 1 B Sample1 2 B Sample1 3 B Sample1 4 B Sample1 5 B Sample1 6 B 
    0 0.000038 0.000024 -0.000029 0.000008 0.000005 0.000012 
    1 0.000034 -0.000014 -0.000032 0.000041 0.000036 0.000028 
    2 0.000002 -0.000027 0.000010 0.000008 0.000005 -0.000014 
    3 0.000036 0.000003 -0.000011 0.000003 0.000002 -0.000006 
    4 0.000045 -0.000029 -0.000027 0.000037 0.000042 0.000018 
    5 0.000012 -0.000053 0.000015 0.000014 0.000020 -0.000023 
    6 0.000036 -0.000023 0.000004 0.000009 0.000004 -0.000028 
    7 0.000046 -0.000044 -0.000020 0.000042 0.000041 -0.000002 
    8 0.000013 -0.000071 0.000011 0.000019 0.000028 -0.000036 
    9 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 

、すべての

(x[j]-x[i]) = 0.000008 
+1

入力したDataframeと期待される出力の例を挙げることができますか? – Allen

+0

あなたはおそらく 'apply'を探していますが、これは本当に列のループより効率的ではありません。 –

+0

'x'はどこから来ますか?それは 'シリーズ'、numpy 'ndarray'なのでしょうか? –

答えて

0

まず、あなたはベクトル化操作を用いて同様の結果を得ることができます。積分の各要素は、xの対応する差によってスケーリングされた現在の値と次の値の平均値になります。y最終的な積分は、これらの要素の累積合計にすぎません。あなたはここに

def findB(x, y): 
    """ 
    x : pandas.Series 
    y : pandas.DataFrame 
    """ 
    mean_y = (y[:-1] + y.shift(-1)[:-1])/2 
    delta_x = x.shift(-1)[:-1] - x[:-1] 
    scaled_int = mean_y.multiply(delta_x) 
    cumulative_int = scaled_int.cumsum(axis='index') 
    return cumulative_int.shift(1).fillna(0) 

DataFrame.shiftSeries.shiftような何かをすることによって、同じ結果を得ることができ、現在の「次」の要素のインデックスを一致させるために使用されています。適切な軸('index''column')が使用されるようにするには、*演算子ではなくDataFrame.multiplyを使用する必要があります。最後に、DataFrame.cumsumは、最終的な積分ステップを提供する。 DataFrame.fillnaは、元のソリューションと同じように、最初の行がゼロになるようにします。すべてのネイティブ・パンダの機能を使用する利点は、任意の数の列を持つデータフレームを渡して、それらをすべて同時に操作できることです。

関連する問題