2017-08-27 5 views
0

Vielen Dank für die Vorschläge unten, ich habe meine Frage geändert, um es deutlicher zu machenPython Pandas Valueerror

Ich habe einen Datenrahmen (bp) mit einer Waage sowie die (jährlich) Sammlungen in den Spalten 1 bis 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']) 

ich versuche, die Balance im nächsten Jahr zu projizieren (balancieren so in Spalte 1 sollte 1 Saldo weniger Sammlung im Jahr beginnen). Gleichzeitig möchte ich das Guthaben auf Null notieren, wenn keine weiteren Sammlungen erwartet werden.

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 

Der obige Code funktioniert, aber das Gleichgewicht auf Null nicht aufschreiben, wenn nicht mehr Sammlungen zu erwarten sind, habe ich folgendes probiert, aber das gibt einen Fehler. Ich nehme an, das liegt daran, dass ich die Zeilen vergleiche (überprüfe, ob es zukünftige Sammlungen in bp gibt) und gbv.iloc [:, i] zwingt das Ergebnis auf die gesamten Spalten. Ich bin mir nicht sicher, wie ich das machen soll.

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(). 

Ich versuche, die folgende Ausgabe zu erhalten:

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 

Irgendwelche Vorschläge willkommen!

+3

Und was genau ist das "gewünschte Ergebnis". – MSeifert

+0

Um den Saldo auf Null zu schreiben, wenn keine weiteren Sammlungen erwartet werden, und den Saldo auf Null setzen (wenn Sammlungen> Saldo) – Jelmerd

+1

Entschuldigung, ich hätte konkreter sein sollen: Bitte geben Sie an, wie 'gbv' am Ende aussehen soll . Genau wie du es mit dem Input gemacht hast. :) Es ist viel einfacher, Text zu verstehen, wenn Sie das Ergebnis haben, um zu verifizieren, dass es * richtig verstanden wurde *. – MSeifert

Antwort

0

Verstanden! Der Vollständigkeit halber werde ich die Antwort hier posten. Der Trick besteht darin, nach den Zeilen zu filtern, in denen die zukünftigen Sammlungen null sind.

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] gibt Ihnen die Serie und wenn Sie die Summe dieser Serie nehmen möchten, sollte die Achse entlang der Zeilen sein. Sieht so aus, als hätten Sie einen Fehler in Ihrem Code. Ändern Sie Zeile 5 Ihres Codes in dem folgenden Code und sehen Sie, ob es funktioniert.

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

Zumindest sollte der Fehler, den Sie bekommen, weggehen.

Verwandte Themen