df1 = pd.DataFrame({'x': ['a', '2.0', '3.0'], 'y': ['4.0', 'b', '6.0']})
x y
0 a 4.0
1 2.0 b
2 3.0 6.0
如果我使用'coerce'处理字符串,则它们将被NaN代替
df2 = df1.apply(lambda x: pd.to_numeric(x.astype(str).str.replace(',',''), errors='coerce'))
x y
0 NaN 4.0
1 2.0 NaN
2 3.0 6.0
如果我使用'ignore'处理字符串,则整列都不会转换(数字仍保留为文本字符串)
df2 = df1.apply(lambda x: pd.to_numeric(x.astype(str).str.replace(',',''), errors='ignore'))
x y
0 a 4.0
1 2.0 b
2 3.0 6.0
答案 0 :(得分:5)
这是预期的输出,因为如果选中to_numeric
,则可以看到:
错误:{'ignore','raise','coerce'},默认为'raise'
如果'raise',则无效的解析将引发异常
如果为'coerce',则无效的解析将设置为NaN
如果为'ignore',则无效的解析将返回输入
可能的解决方案是将丢失的值替换为原始值-但将混合数字与字符串值混合在一起,例如注释中指向@ anky_91的字符串:
df2 = df1.apply(lambda x: pd.to_numeric(x.astype(str).str.replace(',',''), errors='coerce'))
df3 = df2.fillna(df1)
或者:
df3 = df2.combine_first(df1)
检查类型:
print (df3.applymap(type))
x y
0 <class 'str'> <class 'float'>
1 <class 'float'> <class 'str'>
2 <class 'float'> <class 'float'>