1

感谢您提供以下建议,我已经修改了我的问题以使其更清楚

我有一个带有余额的数据框(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

欢迎任何建议!

4

2 回答 2

1

知道了!为了完整起见,我将在此处发布答案。诀窍是过滤未来集合为零的行。

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
于 2017-08-28T18:00:19.653 回答
0

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

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

至少,你得到的错误应该消失。

于 2017-08-27T13:52:51.807 回答