2017-12-26 33 views
0

나는 다음과 같은 dataframe 있습니다페어 곱셈과 행 반복을 결합

   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 또는 숫자입니다.

   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 
: 그래서 결국은 같을 것이다

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

: 나는 1을 유지하기 위해 최초의 null 이외의 값이 내 두 번째 열을 부탁하고 이후의 각 값은 다음 공식으로 설명 할 수있다

많은 루프를 시도했지만 가장 가까운 것이 정확하다고 생각하지만 결국에는 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

은 매력처럼 작동합니다. 정말 고맙습니다! –