2017-08-27 147 views
0

謝謝你的建議,下面,我已經修改了我的問題,以使其更清晰Python的大熊貓ValueError異常

我有一個數據幀(BP)與平衡,以及在列1(年)的集合 - 6。

import pandas as pd 
bp = pd.DataFrame({'Balance': {0: 20000, 1: 2000, 2: 7000}, 
'1': {0: 500, 1: 400, 2: 100}, 
'2': {0: 1500, 1: 500, 2: 2000}, 
'3': {0: 0, 1: 1000, 2: 3000}, 
'4': {0: 0, 1: 500, 2: 20}, 
'5': {0: 0, 1: 50, 2: 0}, 
'6': {0: 0, 1: 0, 2: 0}, 
},columns=['Balance','1','2','3','4','5','6']) 

我試圖在下一年投資餘額(所以第1欄的餘額應該是第1年的開始餘額少收集)。但是,與此同時,如果預計沒有更多收集,我想將餘額記爲零。

gbv = bp.copy() 

startcol =1 
endcol = 7 
for i in range(startcol,endcol): 
     gbv.iloc[:,i] = gbv.iloc[:,i-1] - bp.iloc[:,i] 
gbv[gbv < 0] = 0 

gbv 

上面的代碼工作,但不寫下來的餘額爲零,如果沒有更多的徵收預計,我曾嘗試以下,但是這給出了一個錯誤。我想這是因爲我正在比較行(檢查bp是否有將來的集合),gbv.iloc [:,i]強制結果在總列上。不知道我應該怎麼做,但。

gbv = bp.copy() 

startcol =2 
endcol = 14 
for i in range(startcol,endcol): 
    if bp.iloc[:,i:endcol].sum(axis=0) == 0: 
     gbv.iloc[:,i]= 0 
    else: 
     gbv.iloc[:,i] = gbv.iloc[:,i-1] - bp.iloc[:,i] 

gbv[gbv < 0] = 0 

gbv 



--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-22-1920f826f3ea> in <module>() 
     4 endcol = 14 
     5 for i in range(startcol,endcol): 
----> 6  if bp.iloc[:,i:endcol].sum(axis=0) == 0: 
     7   gbv.iloc[:,i]= 0 
     8  else: 

/Users/Jelmer/anaconda/lib/python3.5/site-packages/pandas/core/generic.py in __nonzero__(self) 
    951   raise ValueError("The truth value of a {0} is ambiguous. " 
    952       "Use a.empty, a.bool(), a.item(), a.any() or a.all()." 
--> 953       .format(self.__class__.__name__)) 
    954 
    955  __bool__ = __nonzero__ 

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

我試圖得到下面的輸出:

Balance 1  2  3  4  5  6 
0 20000 19500 18000 0  0  0  0 
1 2000 1600 1100 100  0  0  0 
2 7000 6900 4900 1900 1880 0  0 

任何建議,歡迎!

+3

究竟是什麼「理想的結果」。 – MSeifert

+0

如果預計沒有進一步的收藏,將餘額記爲零,並將餘額設置爲零(當收藏>餘額時) – Jelmerd

+1

對不起,我應該更具體一些:請包括'gbv'應該在最後看起來如何。就像你對輸入做的一樣。 :)如果你有結果來驗證它被正確理解*,那麼理解文本就容易多了。 – MSeifert

回答

0

Got it!爲了完整起見,我會在這裏發佈答案。訣竅是過濾未來收集爲零的行。

gbv = bp.copy() 

startcol =2 
endcol = 14 
for i in range(startcol,endcol): 
     gbv.iloc[:,i] = gbv.iloc[:,i-1] - bp.iloc[:,i] 
     gbv.iloc[:,i][bp.iloc[:,i:endcol].sum(axis=1)==0] = 0 
     gbv[gbv < 0] = 0 

gbv 
0

bp.iloc [:,i:endcol]爲您提供了Series,如果您想獲取該系列的總和,軸應該沿着行。看起來你的代碼中有一個錯誤。將代碼的第5行更改爲以下內容,看看它是否有效。

bp.iloc[:,i:endcol].sum(axis=0) == 0 

至少,你得到的錯誤應該消失。