如何在PySpark中创建一个新的DataFrame,如果列表中的值在不同DataFrame的行中?

0kjbasz6  于 2022-12-11  发布在  Spark
关注(0)|答案(1)|浏览(188)

我有一个**“pyspark.sql.dataframe.DataFrame”**格式的示例 Dataframe :

| ID | SampleColumn1| SampleColumn2 | SampleColumn3|
|--- |--------------| ------------  | ------------ |
| 1  |sample Apple  | sample Cherry | sample Lime  |
| 2  |sample Cherry | sample lemon  | sample Grape |

我想创建一个基于这个初始 Dataframe 的新 Dataframe 。如果列表中的一个值[Apple,Lime,Cherry]出现在行的任何列中,它将在新 Dataframe 中的列中显示为1。在这种情况下,输出应为:

listOfValues = ['Apple','Lime','Cherry']

| ID | Apple | Lime | Cherry |
| 1  |  1    |  1   |    1   |
| 2  |  0    |  0   |    1   |

我目前有以下使用正常Pandas:

keywords = ['Apple', 'Lime', 'Cherry']
tmp = (df.melt(ignore_index=False)
        .value.str.extract(
            f'({"|".join(keywords)})',
            expand=False)
        .dropna())

res = (pd.crosstab(index=tmp.index, columns=tmp)
        .rename_axis(index=None, columns=None))

我想实现这个输出,但是我想使用PySpark,因为当前的平台不允许使用Pandas或普通的Python命令。

rkue9o1l

rkue9o1l1#

连接所有列,遍历每个关键字,并检查它是否存在于新的连接列中。这将给出True & False。如果您对1 & 0感兴趣,则使用when()& otherwise()。

df = spark.createDataFrame(data=[["1","sample Apple","sample Cherry","sample Lime"],["2","sample Cherry","sample lemon","sample Grape"],["3","sample nothing","sample nothing","sample nothing"]], schema=["ID","SampleColumn1","SampleColumn2","SampleColumn3"])
keywords = ['Apple', 'Lime', 'Cherry']
columns = [c for c in df.columns if c != "ID"]

df = df.select("ID", F.concat_ws(" ", *columns).alias("all"))

for k in keywords:
  df = df.withColumn(k, F.when(F.lower(F.col("all")).contains(k.lower()), F.lit(1)).otherwise(F.lit(0)))

df = df.drop("all")

[Out]:
+---+-----+----+------+
| ID|Apple|Lime|Cherry|
+---+-----+----+------+
|  1|    1|   1|     1|
|  2|    0|   0|     1|
|  3|    0|   0|     0|
+---+-----+----+------+

相关问题