Ruk*_*ech 12 python exception-handling pandas
如果我有一个DataFrame:
myDF = DataFrame(data=[[11,11],[22,'2A'],[33,33]], columns = ['A','B'])
Run Code Online (Sandbox Code Playgroud)
提供以下数据框(从stackoverflow开始,并且没有足够的信誉用于DataFrame的图像)
| A | B |
0 | 11 | 11 |
1 | 22 | 2A |
2 | 33 | 33 |
Run Code Online (Sandbox Code Playgroud)
如果我想将B列转换为int值并删除无法转换的值,我必须这样做:
def convertToInt(cell):
try:
return int(cell)
except:
return None
myDF['B'] = myDF['B'].apply(convertToInt)
Run Code Online (Sandbox Code Playgroud)
如果我只这样做:
是myDF [ 'B'].应用(int)的
错误显然是:
pandas.lib.map_infer中的C:\ WinPython-32bit-2.7.5.3\python-2.7.5\lib\site-packages\pandas\lib.pyd(pandas\lib.c:42840)()
ValueError:int()的基数为10的无效文字:'2A'
有没有办法将异常处理添加到myDF ['B'].apply()
先感谢您!
atk*_*t12 13
我有同样的问题,但对于一个更一般的情况,很难判断该函数是否会产生异常(即你无法用一些简单的东西明确地检查这个条件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))
Run Code Online (Sandbox Code Playgroud)
Jef*_*eff 10
做得更好/更快:
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
Run Code Online (Sandbox Code Playgroud)
这是一种做到这一点的矢量化方法.该coerce标志表示标记为nan无法转换为数字的任何内容.
如果您愿意,您当然可以将其添加到单个列中.
实现这一目标的方法lambda:
myDF['B'].apply(lambda x: int(x) if str(x).isdigit() else None)
Run Code Online (Sandbox Code Playgroud)
供您参考:
>>> myDF
A B
0 11 11
1 22 2A
2 33 33
[3 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)
>>> myDF['B'].apply(lambda x: int(x) if str(x).isdigit() else None)
0 11
1 NaN
2 33
Name: B, dtype: float64
Run Code Online (Sandbox Code Playgroud)