当前位置: 首页 > 知识库问答 >
问题:

如果某列在另一个Spark数据表中,Pyspark则根据该列创建新列

公良向阳
2023-03-14

我试图在Spark Dataframe中创建一个列,如果列的行位于单独的Dataframe中,则为标志。

这是我的主Spark Dataframe(df_main)

+--------+
|main    |
+--------+
|28asA017|
|03G12331|
|1567L044|
|02TGasd8|
|1asd3436|
|A1234567|
|B1234567|
+--------+

这是我的引用(df_ref),这个引用中有数百行,所以我显然不能像这个解决方案或这个解决方案那样硬编码它们

+--------+
|mask_vl |
+--------+
|A1234567|
|B1234567|
...
+--------+
df_main['is_inref'] = np.where(df_main['main'].isin(df_ref.mask_vl.values), "YES", "NO")
+--------+--------+
|main |is_inref|
+--------+--------+
|28asA017|NO      |
|03G12331|NO      |
|1567L044|NO      |
|02TGasd8|NO      |
|1asd3436|NO      |
|A1234567|YES     |
|B1234567|YES     |
+--------+--------+

我已经尝试了下面的代码,但我不明白图片中的错误是什么意思。

df_main = df_main.withColumn('is_inref', "YES" if F.col('main').isin(df_ref) else "NO")
df_main.show(20, False)

共有1个答案

松建本
2023-03-14

你已经接近了。我认为您需要的附加步骤是显式创建包含df_ref中的值的列表。

请看下面的插图:

# Create your DataFrames
df = spark.createDataFrame(["28asA017","03G12331","1567L044",'02TGasd8','1asd3436','A1234567','B1234567'], "string").toDF("main")
df_ref =  spark.createDataFrame(["A1234567","B1234567"], "string").toDF("mask_vl")

然后,您可以创建一个列表并使用isin,几乎与您所使用的一样:

# Imports
from pyspark.sql.functions import col, when

# Create a list with the values of your reference DF
mask_vl_list = df_ref.select("mask_vl").rdd.flatMap(lambda x: x).collect()

# Use isin to check whether the values in your column exist in the list
df_main = df_main.withColumn('is_inref', when(col('main').isin(mask_vl_list), 'YES').otherwise('NO'))
>>> df_main.show()

+--------+--------+
|    main|is_inref|
+--------+--------+
|28asA017|      NO|
|03G12331|      NO|
|1567L044|      NO|
|02TGasd8|      NO|
|1asd3436|      NO|
|A1234567|     YES|
|B1234567|     YES|
+--------+--------+
 类似资料:
  • 我有两个熊猫数据框 步骤1:根据df1中唯一的“val”在df2中创建列,如下所示: 步骤2:对于flag=1的行,AA_new将计算为var1(来自df2)*组“A”和val“AA”的df1的'cal1'值*组“A”和val“AA”的df1的'cal2'值,类似地,AB_new将计算为var1(来自df2)*组“A”和val“AB”的df1的'cal1'值*组“A”和val“AB”的df1的'c

  • 如果没有数据,如何根据两个表中两个列的值选择新列。 提前谢了。

  • 我有两个pyspark数据帧 DF1 : df2: 我想向df1添加一个列Location_Id,从df2获取匹配的Id,如下所示: 我如何才能做到这一点?

  • 问题内容: 我确信这个问题以前可能已经被问过,但我似乎找不到正确的答案。如果我有两个清单 我正在尝试使用_list1重新排列_list2中的元素,以便它们完全匹配顺序。什么是最干净的方法?所需的输出: 很抱歉,如果这是重复的,但到目前为止,我只能使用压缩的sorted()方法找到数字列表的答案。 如果_list2是列表列表怎么办? 所需输出: 还有一个假设:如果我想使用_list1作为键对其他任何

  • 我有一个PySpark数据帧,它有几个字段,例如: 我想创建一个新列,将其他注释的值混合到一个新字符串中。期望的输出为: 我正在尝试做(伪代码): 如何实现这一点?

  • 问题内容: 我有一个名为Vendor的表,在此表中有一个名为AccountTerms的列,该列仅显示一个值(即0、1、2、3),依此类推。我也有一个要使用()的列,以反映该值的含义,例如: 等等… 我需要的是一个脚本,它将查看AccountTerms中的值,然后将更新以显示上面显示的单词值。我该怎么做呢? 问题答案: 我将尝试以一种尽可能简单的方式来解释这一点,以便于理解: 假设您有一个这样的表设