2016-05-18 115 views
2

我想獲得一個新的df列'dos',從100開始,然後每個單元格將乘以上面的數字相應的單元格'uno'。出於某種原因,它只是給我的NaN後100乘以上面的單元格創建熊貓數據框與公式

GrVsVal = pd.DataFrame(columns = ['uno', 'dos'], index = df_ch.index) 
GrVsVal['uno'] = 1 + (df_ch['IVV'] - df_ch['IVE']) 
GrVsVal['dos'].ix[0] = 100 
GrVsVal['dos'].ix[1:] = GrVsVal['uno'].ix[1:] * GrVsVal['dos'].ix[0:] 

print GrVsVal 

它給了我:

  uno  dos 
Date  
1/2/12 .997  100 
1/3/12 .677  NaN 
1/4/12 .986  NaN 

所以第一個NaN的應該是100 * 0.677,第二NaN的將是第一個結果NaN * .986

回答

1
GrVsVal = pd.DataFrame({'uno': 1 + df_ch['IVV'] - df_ch['IVE']}, index = df_ch.index) 

GrVsVal['dos'] = 100 
GrVsVal.loc[1:, 'dos'] = GrVsVal.uno[1:].cumprod() * 100 
>>> GrVsVal 
      uno  dos 
    Date 
1/2/12 0.997 100.0000 
1/3/12 0.677 67.7000 
1/4/12 0.986 66.7522 
+0

哇。比我的解決方案更優雅。榮譽 –

+0

謝謝我的朋友!你不知道我有多麼沮喪,試圖找出這哈哈! – James

1

有些東西在代碼中很難分辨出來。但是,這得到了你想要的(如果我理解正確的)結果:

import pandas as pd 


date = ['1/2/12', '1/3/12', '1/4/12'] 
uno = [.997, .677, .986] 

GrVsVal = pd.DataFrame({'date': date, 'uno':uno}) 
dos = [100] 
i = 0 
for u in GrVsVal.iterrows(): 
    while i+1 < len(GrVsVal['uno']): 
     dos.append(GrVsVal['uno'][i+1]*dos[i]) 
     i += 1 

GrVsVal['dos'] = dos 

print(GrVsVal) 

運行這一點,你會看到結果。然後根據需要調整代碼。 編輯:對不起,我搞砸了。應該現在修好。