2017-08-27 9 views
0

は、私はバランスでデータフレーム(BP)と同様に、列1で(年間)のコレクションを持っているPythonのパンダとValueErrorが

それをより明確にするために私の質問を改正している、以下の提案をいただき、ありがとうございます。

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

完全性のために私はここに答えを掲示するでしょう。このトリックは、将来のコレクションがゼロの行をフィルタリングすることです。

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]はあなたにシリーズを与え、そのシリーズの合計を取る場合、軸は行に沿っている必要があります。あなたのコードにバグがあるようです。コードの5行目を次のように変更して、それが機能するかどうか確認してください。

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

少なくとも、エラーは表示されなくなります。