python divide value by 0
我试图比较一个表中的值,所以有些值可能是零,因此我得到一条错误消息,不能除以0。为什么脚本不返回inf而不是错误?当我在一个只有一列的数据帧上测试这个脚本时,如果有多个列,它会因零除错误而中断。
1 2 | table[change] = ['{0}%'.format(str(round(100*x,2)) for x in \ (table.ix[:,table.shape[1]-1] - table.ix[:,0]) / table.ix[:,0]] |
表示例:
1 2 3 | 0 1 2 3 4 5 6 \ numbers 0.0 100.0 120.0 220.0 250.0 300.0 500.0\\ revenues 50.0 100.0 120.0 220.0 250.0 300.0 500.0 |
其中,
我尝试了其他两种方法,但它们对我不起作用。
你能在回答中更具描述性一点吗?我正在努力采取所给的方法。
我有另一种方法,我正在尝试,但它不起作用。还不知道问题是什么:
1 2 3 4 5 6 | for index, row in table.iterrows(): if row[0] == 0: table[change] = 'Nan' else: x = (row[-1] - row[0]) / row[0] table[change] = '{0} {1}%'.format( str(round(100 * x, 2))) |
"change"列包含相同的值(即表的最后一个比较)
除以零通常是一个严重的错误;默认为无穷大不适合大多数情况。
在尝试计算该值之前,请检查除数(本例中的
或者您可以按照@andrew的建议将除法计算包装在try/except块中。
看起来python有一个特定的
1 2 3 4 5 | try: table[change] = ['{0}%'.format(str(round(100*x,2)) for x in \ (table.ix[:,table.shape[1]-1] - table.ix[:,0]) / table.ix[:,0]] except ZeroDivisionError: table[change] = inf |
在这种情况下,您只需划分整个系列,熊猫将替您做INF替换。类似:
1 2 3 4 5 | if df1.ndim == 1: table[change] = inf elif df1.ndim > 1 and df1.shape[0] > 1: table[change] = ['{0}%'.format(str(round(100*x,2)) for x in \ (table.ix[:,table.shape[1]-1] - table.ix[:,0]) / table.ix[:,0]] |
事实上,您的原始示例只有一行,这似乎使熊猫获取了该单元中用于划分的值。如果使用多行数组进行除法,它的行为我认为是您最初期望的。
编辑:
我刚刚发现了我完全忽略的生成器表达式。这比我想象的要容易得多。然后进行正常化,如果你的熊猫版本是最新的,那么你可以打电话给我们。
1 2 3 | table["change"] = 100 * ((table.iloc[:, -1] - table.iloc[:, 0])/ table.iloc[:, 0]) #And if you're running Pandas v 0.17.0 table.round({"change" : 2}) |