python - 哪一个更可取?np.where 还是 .loc?
问题描述
我发现了两种根据条件替换数据框的某些值的形式:
- .loc
mask = df['param'].isnull()
df.loc[mask, 'param'] = 'new_value'
- np.where()
mask = df['param'].isnull()
df['param'] = np.where(mask, 'new_value', df['param'])
两种形式都运作良好,但哪一种是首选?关于这个问题,我应该什么时候使用.loc以及什么时候使用np.where?
解决方案
好吧,不是一个完整的测试,但这里有一个示例。在每次运行 ( loc
, np.where
) 中,数据都被重置为带有种子的原始随机数。
玩具数据 1
在这里,有多个np.nan
有效值。此外,该列是浮点类型。
np.random.seed(1)
df = pd.DataFrame({'param': np.random.choice((1, np.nan), 1000000, p=(0.3,0.7))})
# loc
%%timeit
mask = df['param'].isnull()
df.loc[mask, 'param'] = 'new_value'
# 46.7 ms ± 177 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# np.where
%%timeit
mask = df['param'].isnull()
df['param'] = np.where(mask, 'new_value', df['param'])
# 86.8 ms ± 2.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
玩具数据 2:
这里的值小于np.nan
有效值,并且该列是对象类型:
np.random.seed(1)
df = pd.DataFrame({'param': np.random.choice(("1", np.nan), 1000000, p=(0.7,0.3))})
相同的故事:
df.loc[mask, 'param'] = 'new_value'
# 47.8 ms ± 350 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
df['param'] = np.where(mask, 'new_value', df['param'])
# 58.9 ms ± 1.72 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
所以与@cs95 的评论相反,loc
似乎跑赢大盘np.where
。
推荐阅读
- python - TypeError: searchsorted 需要兼容的 dtype 或标量,而不是 ndarray (Pandas)
- python - Google Appengine 数据存储区 - 无法使用不同的列进行排序
- javascript - 将状态与数组的值反应,对于多个复选框值,在 setState() 之外和之后变异为数字
- sql-server - 在 ASP.NET Core / EF Core 中本地化参考数据的最佳方法
- java - 改进大量年轻代调用的垃圾收集
- html - 旋转时填充所有内容
- angular - 在注销时为当前路由激活 authguard (Angular)
- javascript - MDC 菜单 - 当焦点位于输入时保持菜单打开
- python - Pandas concat 似乎忽略了索引
- oracle - 如何对 github 存储库中的 sql 文件进行版本控制