2017-12-07 14 views
1

私は600万行のパンダデータフレームを持っています。カラムは次のとおりです。2つのデータフレーム列の間で計算を行う最速の方法は?

['x', 'y'] 

私はxy間の単純な計算を適用し、データフレームに付加する必要があります。

は、これは私が試したものです:

''' 
Calculates the height of a pressure level in feet 
''' 
def pressure_to_elevation(P, T = None): 

    sea_level_pressure = 1013.25 

    if T is not None: 
     # https://www.omnicalculator.com/physics/air-pressure-at-altitude 

     P0 = sea_level_pressure 
     g = 9.80665 
     M = 0.0289644 
     R0 = 8.31447 

     m = (np.log(P/P0)*T)/-(g*M/R0) 
     f = 3.28084 * m 
     return f 

    b = 0.190284 
    c = 145366.45 

    return (1-math.pow((P/sea_level_pressure), b)) * c 


test_df['result'] = test_fd.apply(lambda row: pressure_to_elevation(row['x'], row['y']),axis=1) 

残念ながら、これは...時間のとんでもない量をとり、実際に、私は完全にそれを参照してくださいしたことはありません。

これを行うより速い方法がありますか?私はあなたが別々のステップにこれを破ると、全体のデータフレームを反復を避けるならば、速度が劇的に増加すると考えてい

test_df['result'] = pressure_to_elevation(test_df['x'], test_df['y']) 
+1

これはあなたの__real__関数に依存します - あなたは実際の関数の定義を提供できますか?あなたの現在の質問については、最も速いでしょう: 'test_df ['result'] = test_df ['x'] + test_df ['y']' – MaxU

+0

'.apply'の使用はデータフレーム内の行を反復するための略語です。 6M行、それは遅くなるでしょう。あなたのニーズに応じて、おそらく組み込みのパンダのメソッド/操作を使用してメソッドを見つけることができます。 – James

+0

@MaxU大丈夫、実際の関数を含むように更新されました。 – pookie

答えて

2

はこれを試してみてください。次のショットを出してください。

test_df['result_1'] = (test_df['x']/sea_level_pressure) 
test_df['result_1'] = test_df['result']**0.190284 
test_df['result_1'] = (1 - test_df['result'])*145366.45 

test_df['result_2'] = 3.28084*((np.log(test_df['x']/sea_level_pressure)*test_df['y'])/(-1*(9.80665*0.0289644/8.31447))) 

test_df['final_result'] = np.where(pd.isnull(test_df['y']), test_df['result_1'], test_df['result_2']) 
+0

素晴らしい、ありがとう! – pookie

+0

@pookie、うれしい! :) – MaxU

0

def pressure_to_elevation(P, T): 

    sea_level_pressure = 1013.25 

    P0 = sea_level_pressure 
    g = 9.80665 
    M = 0.0289644 
    R0 = 8.31447 

    b = 0.190284 
    c = 145366.45 

    return np.where(T.notnull(), 
        3.28084 * ((np.log(P/P0)*T)/-(g*M/R0)), 
        (1-np.pow((P/sea_level_pressure), b)) * c) 

は使用方法:

+0

ありがとうございます - あなたの勘が正しいです、これも動作します。 – pookie

関連する問題