Pandas .apply()函数中的异常处理

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)

  • 我认为这回答了问题,而接受的答案以不同的方式解决了问题。 (5认同)

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无法转换为数字的任何内容.

如果您愿意,您当然可以将其添加到单个列中.

  • 请注意,`convert_objects()` 已从 Pandas 0.21.0 中弃用 (2认同)

Ami*_*mit 9

实现这一目标的方法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)