Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas.apply()函数中的异常处理_Python_Exception Handling_Pandas - Fatal编程技术网

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