如何在pandas系列中用Nan替换非字符串值?

问题描述

尝试使用 pandas.Series.apply 函数执行此操作,但认为在处理大量数据时速度较慢。有没有更快的方法来替换值?

这是我尝试过的,但它在大型系列上很慢(例如有百万个项目)

s = pd.Series([1,2,3,'str1','str2',3])
s.apply(lambda x: x if type(x) == str else np.nan)

解决方法

to_numericerrors='coerce' 一起使用:

pd.to_numeric(s,errors='coerce')

如果还需要整数加Int64

pd.to_numeric(s,errors='coerce').astype('Int64')

编辑:您可以将 isinstancemap 一起使用,也可以使用 Series.where

#test 600k
N = 100000
s = pd.Series([1,2,3,'str1','str2',3] * N)


In [152]: %timeit s.apply(lambda x: x if type(x) == str else np.nan)
196 ms ± 2.81 ms per loop (mean ± std. dev. of 7 runs,10 loops each)

In [153]: %timeit s.map(lambda x: x if isinstance(x,str) else np.nan)
174 ms ± 3.66 ms per loop (mean ± std. dev. of 7 runs,10 loops each)

In [154]: %timeit s.where(s.map(lambda x: isinstance(x,str)))
168 ms ± 3.63 ms per loop (mean ± std. dev. of 7 runs,10 loops each)

In [155]: %timeit s.where(pd.to_numeric(s,errors='coerce').isna())
366 ms ± 3.19 ms per loop (mean ± std. dev. of 7 runs,1 loop each)