问题描述
尝试使用 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_numeric
与 errors='coerce'
一起使用:
pd.to_numeric(s,errors='coerce')
如果还需要整数加Int64
:
pd.to_numeric(s,errors='coerce').astype('Int64')
编辑:您可以将 isinstance
与 map
一起使用,也可以使用 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)