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

时间:2020-02-15 05:37:58

标签: python pandas

我有一种情况需要替换许多列中的字符串值:

  1. 用于替换每列更改的值
  2. 我需要保留现有的NaN

对我来说,我有一系列步骤似乎应该起作用,但实际上没有作用; “就地”步骤不起作用。一些虚拟测试代码:

制作一个数据框

df = pd.DataFrame([[np.nan, 2, np.nan, np.nan],
                   [3, 4, np.nan, 1],
                   [np.nan, np.nan, np.nan, 5],
                   [np.nan, 3, np.nan, 'foo']],
                  columns=list('ABCD'))

计算替代值,例如从最后一列开始计算

special_value = pd.to_numeric(df['D'], errors='corece').min() / 2
special_value
0.5

看看

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

1 个答案:

答案 0 :(得分:1)

如果使用.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