Python `请尝试在应用函数中使用`/`except`块
我正在尝试将一个函数应用于Python `请尝试在应用函数中使用`/`except`块,python,python-3.x,pandas,Python,Python 3.x,Pandas,我正在尝试将一个函数应用于pandasdataframe。我的函数有一个try/except块来捕获异常,比如zeroditionerror,但它失败了 数据框有100多列。通过选择列的子集,实际函数将应用于每一行 下面是我的代码 功能: import pandas as pd import numpy as np def d(x): x0=22/7 try: return x0/x except: return 0 df=pd.Dat
pandas
dataframe。我的函数有一个try/except
块来捕获异常,比如zeroditionerror
,但它失败了
数据框有100多列。通过选择列的子集,实际函数将应用于每一行
下面是我的代码
功能:
import pandas as pd
import numpy as np
def d(x):
x0=22/7
try:
return x0/x
except:
return 0
df=pd.DataFrame({'a':[0,2,3,4],'b':[0,3,4,5]})
df
Out[174]:
a b
0 0 0
1 2 3
2 3 4
3 4 5
应用函数as后
df.apply(lambda x:d(x))
Out[173]:
a b
0 inf inf
1 1.571429 1.047619
2 1.047619 0.785714
3 0.785714 0.628571
在索引0
Out[173]:
a b
0 0.000000 0.000000
1 1.571429 1.047619
2 1.047619 0.785714
3 0.785714 0.628571
有人能告诉我我错过了什么吗。令人沮丧的是@ 指定列:
df[0].apply(lambda x : d(x))
输出:
对于整个数据集使用:df.applymap(d)指定列:
df[0].apply(lambda x : d(x))
输出:
对于整个数据集使用:df.applymap(d)如果您的真实数据集非常大,这里有一个比使用
apply
更快的替代方法:
import math
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [0, 2, 3, 4], 'b': [0, 3, 4, 5]})
df = (math.pi / df).replace(np.inf, 0)
结果:
a b
0 0.000000 0.000000
1 1.570796 1.047198
2 1.047198 0.785398
3 0.785398 0.628319
如果您的真实数据集非常大,这里有一个比使用
apply
更快的替代方法:
import math
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [0, 2, 3, 4], 'b': [0, 3, 4, 5]})
df = (math.pi / df).replace(np.inf, 0)
结果:
a b
0 0.000000 0.000000
1 1.570796 1.047198
2 1.047198 0.785398
3 0.785398 0.628319
如果您只希望捕获
ZeroDivisionError
,那么应该明确地这样说。切勿使用除之外的纯,并尝试捕获您实际知道如何处理的最小异常集。在此上下文中,除0不会触发异常。不是“catch”不起作用,而是没有引发异常。如果您只希望捕获ZeroDivisionError
,那么应该明确地说。切勿使用除
之外的纯,并尝试捕获您实际知道如何处理的最小异常集。在此上下文中,除0不会触发异常。这并不是“捕获”不起作用,而是没有提出例外。谢谢,但没有帮助。数据框有100多列。通过选择列的子集,此函数将应用于每一行。。与其他解决方案相比,applymap
的性能将非常差。谢谢,但没有帮助。数据框有100多列。通过选择列的子集,此函数将应用于每一行。.applymap
将与其他解决方案相比执行得非常糟糕。抱歉,这里的要点不是在发生被零除时捕获异常。不行efficient@Mansoor解决方案的目的应该是解决实际问题,而不是你认为你可能遇到的切题。对于d(x)
来说,永远不会有异常,因此没有什么可捕捉的。此解决方案完全完成了您要做的事情。@ALollz。好的,谢谢你的回复。。。但我不同意。。。有时候。就这么简单。我有另一种方法。想知道如果有任何异常,为什么不执行“except”块!抱歉,这里的要点不是在发生被零除时捕获异常。不行efficient@Mansoor解决方案的目的应该是解决实际问题,而不是你认为你可能遇到的切题。对于d(x)
来说,永远不会有异常,因此没有什么可捕捉的。此解决方案完全完成了您要做的事情。@ALollz。好的,谢谢你的回复。。。但我不同意。。。有时候。就这么简单。我有另一种方法。想知道如果有任何异常,为什么不执行“except”块!