如何忽略pandas.to_numeric()中的错误并将str更改为int

时间:2019-06-06 09:25:21

标签: python python-3.x pandas

我收到pandas.to_numeric()的意外响应。 如果我使用to_numeric

    a = pd.Series(['1', '2', '3', np.nan])
    b = pd.to_numeric(a, downcast='integer', errors='ignore')
    print([type(each) for each in b])

响应为:[float, float, float, float]

但是,如果我有真正的str系列,例如

    a = pd.Series(['1', '2', '3', np.nan, 'a'])
    b = pd.to_numeric(a, downcast='integer', errors='ignore')
    print([type(each) for each in b])

它返回[str, str, str, float, str]

医生说:

  

如果为“忽略”,则无效的解析将返回输入

我认为无效的解析只是'a',所以我应该得到:[float, float, float, float, str]

问题是如何解决它并获得[float, float, float, float, str]

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用errors='coerce'并将丢失的值替换为原始值-因此,最后一个a位于最后一个Series中。

a = pd.Series(['1', '2', '3', np.nan, 'a'])
b = pd.to_numeric(a, errors='coerce').fillna(a)
print([type(each) for each in b])
[<class 'float'>, <class 'float'>, <class 'float'>, <class 'float'>, <class 'str'>]

另一个想法是使用带有try-exception块的功能:

a = pd.Series(['1', '2', '3', np.nan, 'a'])

def func(x):
    try:
        return int(x)
    except Exception:
        return x

b = a.apply(func)
print([type(each) for each in b])
[<class 'int'>, <class 'int'>, <class 'int'>, <class 'float'>, <class 'str'>]

如果可能的话,整数以字符串表示形式浮点值:

a = pd.Series(['1', '2', '3.3', np.nan, 'a'])

def func(x):
    try:
        return int(x)
    except Exception:
        try:
            return float(x)
        except Exception:
            return x

b = a.apply(func)
print([type(each) for each in b])
[<class 'int'>, <class 'int'>, <class 'float'>, <class 'float'>, <class 'str'>]

答案 1 :(得分:1)

您也可以使用apply

print(a.apply(lambda x: float(x) if str(x).isdigit() else x))

输出:

0      1
1      2
2      3
3    NaN
4      a
dtype: object

并且:

print([type(i) for i in a.apply(lambda x: float(x) if str(x).isdigit() else x)])

输出:

[<class 'float'>, <class 'float'>, <class 'float'>, <class 'float'>, <class 'str'>]