python将值除以0

python将值除以0,python,dataframe,Python,Dataframe,我试图比较一个表中的值,碰巧有些值可能是零,因此我得到一条错误消息,我不能除以0。 为什么脚本不返回inf而不是错误? 当我在一个有一列的数据帧上测试这个脚本时,它可以工作,有多个列时,它会以零除法错误中断 table[change] = ['{0}%'.format(str(round(100*x,2)) for x in \ (table.ix[:,table.shape[1]-1] - table.ix[:,

我试图比较一个表中的值,碰巧有些值可能是零,因此我得到一条错误消息,我不能除以0。 为什么脚本不返回inf而不是错误? 当我在一个有一列的数据帧上测试这个脚本时,它可以工作,有多个列时,它会以零除法错误中断

table[change] = ['{0}%'.format(str(round(100*x,2)) for x in \
                                         (table.ix[:,table.shape[1]-1] - table.ix[:,0]) / table.ix[:,0]]
表示例:

         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]
中的一些值为零,而其他值则不是,因此,根据我的经验,try and except将不起作用,因为一旦可除值等于0,脚本将中断

我尝试了另外两种方法,但它们对我不起作用

你能在回答中再描述一点吗?我正在努力采取给定的方法

我有另一种方法,我正在尝试,但它不起作用。还不知道问题出在哪里:

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”列包含相同的值(即表的最后一次比较)

看起来python有一个特定的
ZeroDivisionError
,在这种情况下,您应该使用
try except
执行其他操作

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
在这种情况下,您可以分割整个系列,Pandas将为您进行inf替换。比如:

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]]
您的原始示例只有一行,这一事实似乎使Pandas在该单元格中获取用于除法的值。如果您使用一个包含多行的数组进行除法,我认为它具有您最初期望的行为

编辑:

我刚刚发现了我完全忽略的生成器表达式。这比我想象的要容易得多。 执行你的正常化,然后,如果你的熊猫版本是最新的,那么你可以打电话过来,如果你想

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

看起来python有一个特定的
ZeroDivisionError
,在这种情况下,您应该使用
try except
执行其他操作

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
在这种情况下,您可以分割整个系列,Pandas将为您进行inf替换。比如:

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]]
您的原始示例只有一行,这一事实似乎使Pandas在该单元格中获取用于除法的值。如果您使用一个包含多行的数组进行除法,我认为它具有您最初期望的行为

编辑:

我刚刚发现了我完全忽略的生成器表达式。这比我想象的要容易得多。 执行你的正常化,然后,如果你的熊猫版本是最新的,那么你可以打电话过来,如果你想

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

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

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

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

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

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

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

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

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

我猜
table.ix[:,0]
是0。@AndrewL。是的,你是对的。你可以用Numpy。看,我在猜
表。ix[:,0]
是0。@AndrewL。是的,你是对的。你可以用Numpy。见@AndrewL。这将在表[change]中的每一行中插入我定义的inf(或任何占位符)。我将在上面进一步阐述说明。
name错误:未定义名称“inf”
。也许你的意思是
float('inf')
,我想你可以指定
inf=float('inf')
。请注意,
0/0
可能会导致NaN,而不是inf。在我使用的python版本中,@PM2Ring
inf
已经被定义为浮点,而我不必显式定义它。有趣。我在Python2.6或3.6中都没有遇到这种情况。那是什么版本?您是否以某种方式导入
inf
,或者是显式导入,或者是由IDE执行的“神奇”导入?是的,我想是从numpy import*导入的。这将在表[change]中的每一行中插入我定义的inf(或任何占位符)。我将在上面进一步阐述说明。
name错误:未定义名称“inf”
。也许你的意思是
float('inf')
,我想你可以指定
inf=float('inf')
。请注意,
0/0
可能会导致NaN,而不是inf。在我使用的python版本中,@PM2Ring
inf
已经被定义为浮点,而我不必显式定义它。有趣。我在Python2.6或3.6中都没有遇到这种情况。那是什么版本?您是否以某种方式导入
inf
,或者是显式导入,或者是由您的IDE执行的“神奇”导入?是的,我认为Canopy是从numpy import*导入的。