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
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首先,我知道为什么我现在有一个错误。您键入了错误argerrors='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