Python Pandas 值错误

Python Pandas 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

欢迎提出任何建议!

bp.iloc[:,i:endcol] 给你系列,如果你想取该系列的总和,轴应该沿着行。看起来您的代码中有错误。将代码的第 5 行更改为以下内容,看看它是否有效。

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

至少,您遇到的错误应该消失了。

知道了!为了完整起见,我会 post 在这里回答。诀窍是过滤未来集合为零的行。

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