You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:03:57