我正在处理一个巨大的H2OFrame(〜150gb,〜2亿行),我需要对其进行一些操作。更具体地说:我必须使用框架的ip列来查找每个IP的位置/城市名称,并将此信息添加到框架的每一行中。

由于框架尺寸巨大,因此无法将框架转换为纯python对象并在本地进行操作。因此,我希望能做的是使用H2O群集使用原始帧的city_names列创建一个新的H2OFrame ip,然后合并两个帧。

我的问题有点类似于here提出的问题,我从该问题的答案中收集到的信息是,H2O中无法对框架的每一行进行复杂的操作。真的是这样吗?毕竟,H2OFrameapply函数只接受不带自定义方法的lambda。

我想到的一个选择是使用Spark/Sparkling Water进行此类数据处理,然后将spark框架转换为H2OFrame进行机器学习操作。但是,如果可能的话,我宁愿避免这种情况,而只使用H2O,尤其是由于这种转换会产生额外的开销。

因此,我想可以归结为:是否有任何方法可以仅使用H2O进行这种处理?如果不是这样,还有另一种方法可以执行而不必更改群集结构(即不必将H2O群集转换为苏打水群集吗?)。

最佳答案

是的,当与H2OFrame一起使用apply时,您不能传递函数,而只能接受lambda。例如,如果您尝试传递tryit函数,则会显示以下错误,显示限制:

H2OValueError: Argument `fun` (= <function tryit at 0x108d66410>) does not satisfy the condition fun.__name__ == "<lambda>"


如您所知,苏打水是另一种选择,它首先在spark中执行所有数据处理,然后将您的数据推送到ML的H2O中。

如果您要坚持使用H2O,那么您的选择是仅遍历数据框以自己的方式处理元素。根据您的数据,以下选项可能会花费很少的时间,但是它不会要求您移动环境。


通过仅选择“ ip”列来创建新的H2O框架,并使用NA向其添加位置,城市和其他空列。
遍历所有ip值并基于“ ip”,找到位置/城市并将位置,城市和其他列值添加到现有列
最后cbind具有原始H2OFrame的新h2oFrame
检查“ ip”和“ ip0”列是否与100%匹配正确合并,然后删除重复的“ ip0”列之一。
删除其他多余的H2OFrame以节省内存

关于python - 向H2OFrame中的每一行添加其他数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46317073/

10-12 21:25