关于dataframe:python除以0的值

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

其中,table.ix[:,0]为0.0。

table.ix[:,0]中的一些值是零,而其他的则不是,因此,除非在我的经验中,尝试,否则将不起作用,因为一旦可除的值等于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"列包含相同的值(即表的最后一个比较)


除以零通常是一个严重的错误;默认为无穷大不适合大多数情况。

在尝试计算该值之前,请检查除数(本例中的table.ix[:,0]是否等于零。如果是,则跳过计算,只需指定所需的任何值。

或者您可以按照@andrew的建议将除法计算包装在try/except块中。


看起来python有一个特定的ZeroDivisionError,在这种情况下,您应该使用try except来做其他事情。

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})