2017-12-26 27 views
0

と行の繰り返しを組み合わせ、私は次のデータフレームを持っている:はペアごとの乗算

   in_scenario_USA USA index_in 
month year        
4  1960    NaN   0 
5  1960    NaN   0 
6  1960   0.000000   1.0 
7  1960   0.000000   1.0 
8  1960   0.000000   1.0 
9  1960   0.000000   1.0 
10 1960   0.000000   1.0 
11 1960   0.000000   1.0 
12 1960   0.000000   1.0 
1  1961   0.000000   1.0 
2  1961   0.025536   1.0 
3  1961   0.003843   1.0 
4  1961   0.019139   1.0 
5  1961   0.000000   1.0 

最初の列は、一ヶ月の割合リターンです。私のシナリオに基づいて、それは0か数字です。私は1のままにその最初の非NULL値を持つことが、私の第二のカラムを希望して、後続の各値は以下の式で説明することができますので、最後に、それは次のようになり

USA index_in[i] = USA index_in[i-1] * (1 + in_scenario_USA)[i] 

   in_scenario_USA USA index_in 
month year        
4  1960    NaN   0 
5  1960    NaN   0 
6  1960   0.000000   1.0 
7  1960   0.000000   1.0 
8  1960   0.000000   1.0 
9  1960   0.500000   1.5 
10 1960   0.500000   2.25 
11 1960   0.000000   2.25 
12 1960   0.000000   2.25 
1  1961   0.000000   2.25 
2  1961   -0.200000   1.8 
3  1961   0.100000   1.98 
4  1961   0.100000   2.178 
5  1961   0.000000   2.178 

私は多くのループを試しましたが、私が一番近いと感じるものはこれですが、最後にはNaN値しか得られません。

for i in range(0, len(df_merged[col + ' index_in'])): 
    if df_merged[col + ' index_in'].iloc[i] == 1 and (df_merged[col + ' index_in'].iloc[-i] == 0): 
     continue 
    else: 
     df_merged[col + ' index_in'].iloc[i] = np.multiply(df_merged[col + ' index_in'].iloc[i-1], df_merged['in_scenario_' + col].iloc[i]) 

ありがとうございました。

答えて

2

あなたの問題は、最初のカップルの行にあるNaNの値であり、乗算され、結果としてNaN値が加算されると思います。これを試してみてください:

newcol = [] 
firstnonnan = True 
for index, row in df.iterrows(): 
    if row['in_scenario_USA'].isnull(): 
     newcol.append(row['USA_index_in']) 
    elif firstnonnan = True: 
     newcol.append(1) 
     firstnonnan = False 
    else: 
     newcol.append(newcol[-1]*(1+row['in_scenario_USA'])) 
df['USA index_in'] = newcol 

基本的には、データフレーム全体を繰り返し処理し、列を上書きするリストを作成します。 NaNの値がある場合は、既にその列にある値と同じ値を使用します。初めてNaNが表示されたら、あなたのリストに1を追加します。その後、リストの最後の項目を以前の値として使用します。

+0

は魅力的です。どうもありがとうございます! –

関連する問題