Python 将字符串替换为数值,同时保留NaN

Python 将字符串替换为数值,同时保留NaN,python,pandas,Python,Pandas,我有一个需要跨多个列替换字符串值的情况: 要替换的值每列更改一次 我需要保存现有的NaN 我有一系列的步骤,对我来说似乎应该有效,但没有;“就地”步骤不起作用。一些虚拟测试代码: 制作数据帧 计算替换值,例如从最后一列开始计算 special_value = pd.to_numeric(df['D'], errors='corece').min() / 2 special_value 看一看 似乎在这里工作 但是没有 如果使用.fillna,则不会保留NaN值 试试这个: def add_va

我有一个需要跨多个列替换字符串值的情况:

  • 要替换的值每列更改一次
  • 我需要保存现有的NaN
  • 我有一系列的步骤,对我来说似乎应该有效,但没有;“就地”步骤不起作用。一些虚拟测试代码:

    制作数据帧 计算替换值,例如从最后一列开始计算

    special_value = pd.to_numeric(df['D'], errors='corece').min() / 2
    special_value
    
    看一看 似乎在这里工作 但是没有
    如果使用
    .fillna
    ,则不会保留NaN值

    试试这个:

    def add_value(df,col):
        condition = df[col].apply(lambda x : True if type(x) == int else False) 
        sp_value = df[col][condition].min()/2 
        df[col] = df[col].apply(lambda x : sp_value if type(x) == str else x)
    
    输出为

    add_value(df,'D')
    
       A    B   C   D
    0   NaN 2.0 NaN NaN
    1   3.0 4.0 NaN 1.0
    2   NaN NaN NaN 5.0
    3   NaN 3.0 NaN 0.5
    

    您共享的代码是为了演示什么?“就地”步骤不起作用。无论如何,使用
    inplace=True
    不是很不受欢迎吗?IIRC他们可能会把它去掉。我添加了输出,以表明我共享的代码显示出缺乏工作性(基于我可能预期的!)是的,我的特殊值运行没有错误;查看我对的编辑question@Shawn首先,我知道为什么我现在有一个错误。您键入了错误arg
    errors='corece'
    。对于
    inplace
    ,我认为它是关于
    pd.\u numeric
    。它返回一个新的
    系列
    ,不更新原始数据。因此,当您调用
    .fillna
    时,它将应用于新数据。解决方案应该是
    df['D']=pd.to_numeric(df['D'].dropna(),errors='concurve')。fillna(特殊值)
    df
    
    pd.to_numeric(df['D'].dropna(), errors='coerce').fillna(value=special_value) 
    
    1    1.0
    2    5.0
    3    0.5
    Name: D, dtype: float64
    
    pd.to_numeric(df['D'].dropna(), errors='coerce').fillna(value=special_value, inplace = True) 
    
    0    NaN
    1      1
    2      5
    3    foo
    Name: D, dtype: object
    
    def add_value(df,col):
        condition = df[col].apply(lambda x : True if type(x) == int else False) 
        sp_value = df[col][condition].min()/2 
        df[col] = df[col].apply(lambda x : sp_value if type(x) == str else x)
    
    add_value(df,'D')
    
       A    B   C   D
    0   NaN 2.0 NaN NaN
    1   3.0 4.0 NaN 1.0
    2   NaN NaN NaN 5.0
    3   NaN 3.0 NaN 0.5