如何在Python的h2o datatable中对整个Frame执行算术运算?
用h2o datatable实现批量列算术运算(替代Pandas循环方案)
嗨,针对你想用h2o datatable替代Pandas提升批量列运算性能的需求,我整理了两种不同版本下的最优方案:
一、旧版本(无#1962特性支持):避免循环的批量更新方案
在不支持f切片的旧版datatable中,你不需要逐列循环,可以利用dt.update()方法结合字典推导式实现一次性批量更新,这是datatable原生优化的向量化操作,性能远优于循环:
import datatable as dt import numpy as np from datatable import f # 创建测试Frame df = dt.Frame({ "C0": np.random.randn(1000000), "C1": np.random.randn(1000000), "C2": np.random.randn(1000000), "C3": np.random.randn(1000000) }) # 生成除第一列外所有列的更新规则:每列除以3 update_rules = {col: f[col] / 3 for col in df.names[1:]} # 执行批量更新 df[:, dt.update(**update_rules)]
这个方法的核心是把所有列的运算逻辑打包成字典,交给dt.update()统一处理,datatable会内部优化整个运算流程,比手动循环效率高很多。
二、新版本(包含#1962提交特性):简洁的切片式运算
正如你提到的,#1962提交新增了f对象的切片支持,在最新的datatable源码版本中,你可以像Pandas一样直接对列切片执行算术运算,语法非常简洁:
import datatable as dt import numpy as np from datatable import f # 创建测试Frame df = dt.Frame({ "C0": np.random.randn(1000000), "C1": np.random.randn(1000000), "C2": np.random.randn(1000000) }) # 直接对第2列及以后的所有列执行除以3的操作 df[:, f[1:]] = df[:, f[1:] / 3] # 如果你习惯用列名切片,也可以这样写(适合列名有规律的场景) # df[:, f["C1":]] = df[:, f["C1":] / 3]
这种写法和你熟悉的Pandas代码几乎一致,完全不需要循环,是最直观高效的方案。要使用这个特性,你需要安装从GitHub最新源码编译的datatable版本。
补充:其他算术运算的适配
不管是哪种版本,你都可以把/3替换成其他算术操作,比如:
- 求和:
f[col] + 5 - 乘法:
f[col] * 2 - 减法:
f[col] - 10
只需要修改字典推导式或者切片运算中的表达式即可。
内容的提问来源于stack exchange,提问作者carrasco
相关产品推荐
相关产品推荐

