我收到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]
答案 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'>]