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

2024-10-01 02:29:36 发布

您现在位置:Python中文网/ 问答频道 /正文

试图用PANSAS.Sun来实现这一点。应用函数,但它认为在大量数据上是慢的。有没有更快的方法来替换值

以下是我尝试过的,但在大型系列中速度较慢(例如百万件)

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

Tags: 数据方法lambda函数iftype速度series
1条回答
网友
1楼 · 发布于 2024-10-01 02:29:36

^{}errors='coerce'一起使用:

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

如果还需要整数,则添加^{}

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

编辑:您可以将isinstancemap一起使用,也可以使用^{}

#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)

相关问题 更多 >