python - 将列从一个数据帧添加到另一个不加入
问题描述
在这里参考谁建议加入将列从一个表附加到另一个表。我确实一直在使用这种方法,但现在对巨大的表和行列表有一些限制
假设我有一个包含 M 个特征的数据框id, salary, age, etc.
+----+--------+------------+--------------+
| id | salary | age | zone | ....
+----+--------+------------+--------------+
我已经对每个功能执行了某些操作以达到这样的效果
+----+--------+------------+--------------+------------+--------------+--------------+--------------+
| id | salary | bin_salary | start_salary | end_salary | count_salary | stat1_salary | stat2_slaary |
+----+--------+------------+--------------+------------+--------------+--------------+--------------+
每个特征都是独立处理的,具有相同的行列表
+----+--------+------------+--------------+------------+
| id | salary | stat1_salary | stat2_salary | stat3_salary|
+----+--------+------------+--------------+------------+
| 301 | x1 | x | x | x |
| 302 | null | x | x | x |
| 303 | x3 | x | x | x |
+----+--------+------------+--------------+
| id | age | stat1_age | stat2_age
+----+--------+------------+--------------+
| 301 | null | x | x
| 302 | x2 | x | x
| 303 | x3 | x | x
最后,我想将它们组合成具有每个特征的所有属性的最终数据框,方法是加入有效的数百到数千个表的唯一 ID,每个表对应一个特征。这个最终的数据框是我的特征向量
| id | salary | stat1_salary | stat2_salary | stat3_salary| age | stat1_age | stat2_age
我遇到了一些导致Out Of Memory
异常的内存限制。提高 executor 和 driver 内存似乎只是一个临时解决方案,并且受到管理员的限制。
JOIN 很昂贵,并且受 pyspark 中的资源限制,我想知道是否可以独立地对每个特征表进行预排序,然后保持该顺序并将整个列彼此相邻,而不是执行昂贵的 JOIN。我可以设法为每个特征表保留所有相同的行列表。我希望没有加入或查找,因为我的 Id 集是相同的。
它是如何实现的?据我了解,即使我按 Id 对每个表进行排序,Spark 也会将它们分发以进行存储,并且检索(如果我想查询回追加)并不能保证具有相同的顺序。
解决方案
除了“加入”之外,似乎没有火花函数可以将列从一个 DF 直接附加到另一个。
如果您仅从一个数据框开始并尝试从数据框的每个原始列生成新特征。我建议使用“pandas_udf”,其中新功能可以附加到所有原始列的“udf”中。
这将完全避免使用“加入”。要控制内存使用,请选择“组”列,我们确保每个组都在执行程序内存规范内。
推荐阅读
- python - PYQT5 Lineedit settext()不刷新
- leaflet - 使用工具栏时如何将属性添加到传单几何人层
- reactjs - 具有道具大小的二维数组仅更新一维
- python - 无法使用 Python SQlite3 启用扩展
- python - 正则表达式:定义一个特定的组并避免每次都重复
- python - 在北极立体投影上用cartopy绘制等纬度线
- python - 返回所有出现多次且具有不同值的键?
- sql - 我可以在 Firebird POSITION 函数中使用通配符吗
- python - 安装 anaconda 是否与已安装的 Python3 和 R 冲突?
- python - “ NotImplementedError: sched 尚未在 Skulpt 第 4 行实现” Python 2.7