Python Pandas.apply()函数中的异常处理
如果我有一个数据帧:Python Pandas.apply()函数中的异常处理,python,exception-handling,pandas,Python,Exception Handling,Pandas,如果我有一个数据帧: myDF = DataFrame(data=[[11,11],[22,'2A'],[33,33]], columns = ['A','B']) 提供以下数据帧(从stackoverflow开始,没有足够的声誉来创建数据帧的映像) 如果要将列B转换为int值并删除无法转换的值,则必须执行以下操作: def convertToInt(cell): try: return int(cell) except: return None
myDF = DataFrame(data=[[11,11],[22,'2A'],[33,33]], columns = ['A','B'])
提供以下数据帧(从stackoverflow开始,没有足够的声誉来创建数据帧的映像)
如果要将列B转换为int值并删除无法转换的值,则必须执行以下操作:
def convertToInt(cell):
try:
return int(cell)
except:
return None
myDF['B'] = myDF['B'].apply(convertToInt)
如果我这样做:
myDF['B'].应用(整数)
错误显然是:
C:\WinPython-32bit-2.7.5.3\python-2.7.5\lib\site packages\pandas\lib.pyd
在pandas.lib.map_推断(pandas\lib.c:42840)()
ValueError:基数为10的int()的文本无效:“2A”
是否有方法将异常处理添加到myDF['B'].apply()中
提前谢谢你 使用
lambda实现这一目标的方法:
myDF['B'].apply(lambda x: int(x) if str(x).isdigit() else None)
请输入:
>>> myDF
A B
0 11 11
1 22 2A
2 33 33
[3 rows x 2 columns]
做得更好/更快:
In [1]: myDF = DataFrame(data=[[11,11],[22,'2A'],[33,33]], columns = ['A','B'])
In [2]: myDF.convert_objects(convert_numeric=True)
Out[2]:
A B
0 11 11
1 22 NaN
2 33 33
[3 rows x 2 columns]
In [3]: myDF.convert_objects(convert_numeric=True).dtypes
Out[3]:
A int64
B float64
dtype: object
这是一种矢量化的方法。强制
标志表示将无法转换为数字的任何内容标记为nan
当然,如果您愿意,您可以对单个列执行此操作。我也有同样的问题,但对于更一般的情况,很难判断函数是否会生成异常(即,您无法使用像isdigit
这样简单的方法显式检查此条件)
经过一段时间的思考,我想出了一个解决方案,将try/except
语法嵌入到一个单独的函数中。我张贴了一个玩具的例子,以防它帮助任何人
import pandas as pd
import numpy as np
x=pd.DataFrame(np.array([['a','a'], [1,2]]))
def augment(x):
try:
return int(x)+1
except:
return 'error:' + str(x)
x[0].apply(lambda x: augment(x))
谢谢你的安排@Amit@RukTech:只是想澄清一下,数据类型是float64 b/c。没有整数版本的NaNOr,请在else子句中使用'None'
而不是None
。@Paul:是float64,我的主要目的是将对象类型转换为数字类型。好主意如果我不知道错误是什么,我如何处理异常?请注意,convert\u objects()
已从Pandas 0.21.0中弃用。我认为这回答了问题,而接受的答案以不同的方式解决了问题。
In [1]: myDF = DataFrame(data=[[11,11],[22,'2A'],[33,33]], columns = ['A','B'])
In [2]: myDF.convert_objects(convert_numeric=True)
Out[2]:
A B
0 11 11
1 22 NaN
2 33 33
[3 rows x 2 columns]
In [3]: myDF.convert_objects(convert_numeric=True).dtypes
Out[3]:
A int64
B float64
dtype: object
import pandas as pd
import numpy as np
x=pd.DataFrame(np.array([['a','a'], [1,2]]))
def augment(x):
try:
return int(x)+1
except:
return 'error:' + str(x)
x[0].apply(lambda x: augment(x))