熊猫:仅将数据框中的数字转换为数字,保留其他所有内容

时间:2019-07-13 12:44:55

标签: python pandas dataframe

源数据框

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

1 个答案:

答案 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'>