python将值除以0
我试图比较一个表中的值,碰巧有些值可能是零,因此我得到一条错误消息,我不能除以0。 为什么脚本不返回inf而不是错误? 当我在一个有一列的数据帧上测试这个脚本时,它可以工作,有多个列时,它会以零除法错误中断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[:,
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版本中,@PM2Ringinf
已经被定义为浮点,而我不必显式定义它。有趣。我在Python2.6或3.6中都没有遇到这种情况。那是什么版本?您是否以某种方式导入inf
,或者是显式导入,或者是由IDE执行的“神奇”导入?是的,我想是从numpy import*导入的。这将在表[change]中的每一行中插入我定义的inf(或任何占位符)。我将在上面进一步阐述说明。name错误:未定义名称“inf”
。也许你的意思是float('inf')
,我想你可以指定inf=float('inf')
。请注意,0/0
可能会导致NaN,而不是inf。在我使用的python版本中,@PM2Ringinf
已经被定义为浮点,而我不必显式定义它。有趣。我在Python2.6或3.6中都没有遇到这种情况。那是什么版本?您是否以某种方式导入inf
,或者是显式导入,或者是由您的IDE执行的“神奇”导入?是的,我认为Canopy是从numpy import*导入的。