基于 PySpark 中另一个数据帧的列值创建指标数组

2024-01-10

我有两个数据框:df1

+---+-----------------+
|id1|           items1|
+---+-----------------+
|  0|     [B, C, D, E]|
|  1|        [E, A, C]|
|  2|     [F, A, E, B]|
|  3|        [E, G, A]|
|  4|  [A, C, E, B, D]|
+---+-----------------+ 

and df2:

+---+-----------------+
|id2|           items2|
+---+-----------------+
|001|           [A, C]|
|002|              [D]|
|003|        [E, A, B]|
|004|        [B, D, C]|
|005|           [F, B]|
|006|           [G, E]|
+---+-----------------+ 

我想创建一个指示向量(在新列中result_array in df1)基于中的值items2。向量的长度应与中的行数相同df2(在本例中它应该有 6 个元素)。如果行位于items1包含相应行中的所有元素items2,否则值为 0.0。结果应如下所示:

+---+-----------------+-------------------------+
|id1|           items1|             result_array|
+---+-----------------+-------------------------+
|  0|     [B, C, D, E]|[0.0,1.0,0.0,1.0,0.0,0.0]|
|  1|        [E, A, C]|[1.0,0.0,0.0,0.0,0.0,0.0]|
|  2|     [F, A, E, B]|[0.0,0.0,1.0,0.0,1.0,0.0]|
|  3|        [E, G, A]|[0.0,0.0,0.0,0.0,0.0,1.0]|
|  4|  [A, C, E, B, D]|[1.0,1.0,1.0,1.0,0.0,0.0]|
+---+-----------------+-------------------------+

例如,在第 0 行中,第二个值为 1.0,因为 [D] 是 [B, C, D, E] 的子集,第四个值为 1.0,因为 [B, D, C] 是 [B, D, C] 的子集, C、D、E]。中的所有其他项目组df2不是[B,C,D,E]的子集,因此它们的指标值为0.0。

我尝试创建所有项目组的列表items2使用collect(),然后应用udf,但我的数据太大(超过1000万行)。


你可以这样继续,

import pyspark.sql.functions as F
from pyspark.sql.types import *

df1 = sql.createDataFrame([
     (0,['B', 'C', 'D', 'E']),
     (1,['E', 'A', 'C']),
     (2,['F', 'A', 'E', 'B']),
     (3,['E', 'G', 'A']),
     (4,['A', 'C', 'E', 'B', 'D'])],
   ['id1','items1'])

df2 = sql.createDataFrame([
     (001,['A', 'C']),
     (002,['D']),
     (003,['E', 'A', 'B']),
     (004,['B', 'D', 'C']),
     (005,['F', 'B']),
     (006,['G', 'E'])],
    ['id2','items2'])

它为您提供了数据框,

+---+---------------+
|id1|         items1|
+---+---------------+
|  0|   [B, C, D, E]|
|  1|      [E, A, C]|
|  2|   [F, A, E, B]|
|  3|      [E, G, A]|
|  4|[A, C, E, B, D]|
+---+---------------+

+---+---------+
|id2|   items2|
+---+---------+
|  1|   [A, C]|
|  2|      [D]|
|  3|[E, A, B]|
|  4|[B, D, C]|
|  5|   [F, B]|
|  6|   [G, E]|
+---+---------+

Now, crossJoin这两个数据框,为您提供笛卡尔积df1 with df2. Then, groupby on 'items1'并应用一个udf得到'result_array'.

get_array_udf = F.udf(lambda x,y:[1.0 if set(z) < set(x) else 0.0 for z in y], ArrayType(FloatType()))

df = df1.crossJoin(df2)\
        .groupby(['id1', 'items1']).agg(F.collect_list('items2').alias('items2'))\
        .withColumn('result_array', get_array_udf('items1', 'items2')).drop('items2')

df.show()

这会给你输出,

+---+---------------+------------------------------+                            
|id1|items1         |result_array                  |
+---+---------------+------------------------------+
|1  |[E, A, C]      |[1.0, 0.0, 0.0, 0.0, 0.0, 0.0]|
|0  |[B, C, D, E]   |[0.0, 1.0, 0.0, 1.0, 0.0, 0.0]|
|4  |[A, C, E, B, D]|[1.0, 1.0, 1.0, 1.0, 0.0, 0.0]|
|3  |[E, G, A]      |[0.0, 0.0, 0.0, 0.0, 0.0, 1.0]|
|2  |[F, A, E, B]   |[0.0, 0.0, 1.0, 0.0, 1.0, 0.0]|
+---+---------------+------------------------------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 PySpark 中另一个数据帧的列值创建指标数组 的相关文章

随机推荐

  • 缩进多行标签

    我有以下自动生成的 HTML http jsfiddle net BrV8X http jsfiddle net BrV8X 使用 CSS 缩进标签以便单选按钮下方有一些空白的建议方法是什么 label display block marg
  • geom_smooth 自定义线性模型

    一边看着this https stackoverflow com questions 44766497 plotting multiple regression lines based on a variable in rs ggplot2
  • 如何隐藏winforms numericUpDown控件上的箭头?

    为了隐藏箭头 我添加了 numericUpDown Controls 0 Hide 它隐藏了箭头 但在打开表单时留下了空白 如何将它们隐藏为像简单的文本框一样 您可以通过访问 numericUpDown 来隐藏箭头Controls财产 您可
  • 按需复制 Google 电子表格

    我创建了一个相当复杂的 Google 电子表格 我希望用户能够单击按钮或点击链接 并获取此电子表格的副本 他们可以在其中填写数据 我稍后会检查手动处理这些数据 无论如何 我可以通过复杂的链接或一些 JavaScript 甚至可能使用服务器端
  • VS Code 中的快速文本滚动

    我正在 macOS 上测试 Visual Studio Code 想知道是否有可以加快滚动速度的组合键 例如 我需要这个来快速从代码的早期部分转到文件末尾的部分 e g in Emacs when I hold up down arrow
  • 使用 Bootstrap 3 如何隐藏表中的列?

    我试图在我的响应式设计中隐藏列col xs and col sm 我首先尝试使用hidden xs hidden sm类 但这不起作用 我也尝试过使用visible desktop正如这里提到的 Twitter Bootstrap 响应式
  • 在特定的 Woocommerce 产品类别档案页面上显示产品属性

    我想在类别页面上显示两个属性 仅在特定类别上显示属性名称和值 我发现的这段代码显示了属性的标签 但复制了值 我真的很难显示类别变量 任何帮助是极大的赞赏 代码 add action woocommerce after shop loop i
  • 将泛型参数与 impl 中的关联类型相匹配

    我有一个具有关联类型和通用结构的特征 trait Generator type Foo fn generate self gt Self Foo struct Baz
  • Eclipse RCP 应用程序中的项目特定首选项页面

    我想为我们的产品启用基于项目的首选项对话框 我偶然发现了两个不同的问题 我如何存储这些项目相关信息 作为一种有根据的猜测 我会尝试这个 IPreferenceStore store new ScopedPreferenceStore new
  • 找出SQL查询的历史记录

    在服务器上执行了更新SQL查询 导致后来出现很多问题 如何获取过去 2 个月执行的更新查询的列表 以便我可以准确跟踪有问题的 SQL 查询 select v SQL TEXT v PARSING SCHEMA NAME v FIRST LO
  • 如何在 SwiftUI NavigationLink 中删除不透明动画

    当点击 NavigationLink 时 它会稍微降低不透明度 有没有办法禁用此功能 我尝试使用 buttonStyle PlainButtonStyle 但这并没有达到预期的效果 它嵌入在滚动视图中 在可定制性方面优于列表 ScrollV
  • 我可以使用 Mojolicious 构建静态网站吗?

    是否可以使用Mojolicious模板系统来构建静态网站 我正在尝试使用这样的 骨架 脚本 use Mojo Template use Mojolicious Plugin DefaultHelpers use Mojolicious Pl
  • 在没有秘密的情况下解码 JWT 令牌

    我通过 JWT 使用私钥创建了一个令牌 但是当我尝试对其进行解码时http kjur github io jsjws tool jwt html http kjur github io jsjws tool jwt html 我发现令牌可以
  • 使用 WCF 以及 jquery(AJAX) 和 html 客户端的文件上传服务

    我想知道如何通过使用 jquery 进行 AJAX 调用来使用 WCF 上传文件 您可以使用一些现成的 JQuery 插件 例如 Ajax文件上传 http www phpletter com Our Projects AjaxFileUp
  • 页面加载完成后如何执行JavaScript函数?

    页面加载完成后如何执行JavaScript函数 Use the onload像这样的事件 window onload function your code here
  • RecyclerView onClick 用于多个按钮并从 Activity 进行处理

    我在用着RecyclerView with CardView并在里面CardView有 2 个按钮 现在 已经实施了onClick事件通过实施View OnClickListener by the ViewHolder静态类并覆盖事件 其工
  • 如何使用 Prototype 自动调整文本区域大小?

    我目前正在为我工 作的公司开发一个内部销售应用程序 并且我有一个允许用户更改送货地址的表单 现在 我认为如果我用于主要地址详细信息的文本区域仅占据其中文本的区域 并且在文本发生更改时自动调整大小 那么它看起来会好得多 这是当前的屏幕截图 有
  • 如何加载页脚之前的内容?

    我的页脚是在内容加载之前加载的 我的导航栏中有多个按钮 单击时会打开一个新组件 当用户点击事件时 它会在从 api 加载事件后发出 此时页脚加载正常 但之后我转到另一个链接 比如说特殊链接 然后页脚在活动之前加载 我尝试如下 事件组件 ts
  • 在选项卡栏控制器之前显示登录屏幕

    我正在做一个 Twitter 应用程序 并在 AppDelegate 上 didFinishLaunchingWithOptions如果该对象上的 NSUserDefaults 为空 我将使用下一个代码来加载登录视图 NSUserDefau
  • 基于 PySpark 中另一个数据帧的列值创建指标数组

    我有两个数据框 df1 id1 items1 0 B C D E 1 E A C 2 F A E B 3 E G A 4 A C E B D and df2 id2 items2 001 A C 002 D