如果我有一个DataFrame:
myDF = DataFrame(data=[[11,11],[22,'2A'],[33,33]], columns = ['A','B'])
提供以下数据框(从stackoverflow开始,并且对于DataFrame的图像没有足够的声誉)
| A | B |
0 | 11 | 11 |
1 | 22 | 2A |
2 | 33 | 33 |
如果我想将B列转换为int值并删除无法转换的值,我必须这样做:
def convertToInt(cell):
try:
return int(cell)
except:
return None
myDF['B'] = myDF['B'].apply(convertToInt)
如果我只这样做:
是myDF [' B&#39]。应用(int)的
错误显然是:
C:\ WinPython-32位-2.7.5.3 \蟒-2.7.5 \ lib中\站点包\大熊猫\ lib.pyd 在pandas.lib.map_infer(pandas \ lib.c:42840)()
ValueError:基数为10的int()的无效文字:' 2A'
有没有办法向myDF添加例外处理[' B']。apply()
提前谢谢!
答案 0 :(得分:12)
我有同样的问题,但是对于一个更普遍的情况,很难判断该函数是否会产生异常(即你无法用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))
答案 1 :(得分: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
这是一种做到这一点的矢量化方法。 coerce
标记表示将nan
标记为无法转换为数字的任何内容。
如果您愿意,您当然可以将其添加到单个列中。
答案 2 :(得分:8)
使用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]
>>> myDF['B'].apply(lambda x: int(x) if str(x).isdigit() else None)
0 11
1 NaN
2 33
Name: B, dtype: float64