我目前有一個串列和一個 Spark 資料框:
['murder', 'violence', 'flashback', 'romantic', 'cult', 'revenge', 'psychedelic', 'comedy', 'suspenseful', 'good versus evil']

我很難找到一種方法來在資料框中創建一個新列,該列從每行的標簽列中獲取第一個匹配的單詞并將其放入該行的新創建列中。
例如,假設標簽列中的第一行只有“謀殺”,我希望它顯示在新列中。然后,如果下一行有“無聊”、“愚蠢”和“邪教”,我希望它在新列中顯示邪教,因為它與串列匹配。如果標簽列的最后一行包含“revenge”、“cult”,我希望它只顯示 revenge,因為它是與串列匹配的第一個單詞。
uj5u.com熱心網友回復:
from pyspark.sql import functions as F
df = spark.createDataFrame([('murder',), ('boring silly cult',), ('revenge cult',)], ['tags'])
mylist = ['murder', 'violence', 'flashback', 'romantic', 'cult', 'revenge', 'psychedelic', 'comedy', 'suspenseful', 'good versus evil']
pattern = '|'.join([f'({x})' for x in mylist])
df = df.withColumn('first_from_list', F.regexp_extract('tags', pattern, 0))
df.show()
# ----------------- ---------------
# | tags|first_from_list|
# ----------------- ---------------
# | murder| murder|
# |boring silly cult| cult|
# | revenge cult| revenge|
# ----------------- ---------------
uj5u.com熱心網友回復:
您可以使用 PySpark UDF(用戶定義函式)。
首先,讓我們撰寫一個 python 函式來查找串列(在本例中為您提供的串列)和字串之間的第一個匹配項,即 tags 列的值:
def find_first_match(tags):
first_match = ''
genres= ['murder', 'violence', 'flashback', 'romantic', 'cult', 'revenge', 'psychedelic', 'comedy', 'suspenseful', 'good versus evil']
for tag in tags.split():
for genre in genres:
if tag==genre:
first_match=tag
return first_match
然后,我們需要將此函式轉換為 PySpark udf,以便我們可以將它與 .withColumn() 操作結合使用:
find_first_matchUDF = udf(lambda z:find_first_match(z))
現在我們可以應用 udf 函式來生成一個新列。假設df是您的 DataFrame 的名稱:
from pyspark.sql.functions import col
new_df = df.withColumn("first_match", find_first_matchUDF(col("tags")))
此方法僅在您的標簽列中的所有標簽都由空格分隔時才有效。
附言
您可以使用注釋避免第二步:
from pyspark.sql.functions import col
@udf(returnType=StringType())
def find_first_match(tags):
first_match = ''
genres= ['murder', 'violence', 'flashback', 'romantic', 'cult', 'revenge', 'psychedelic', 'comedy', 'suspenseful', 'good versus evil']
for tag in tags.split():
for genre in genres:
if tag==genre:
first_match=tag
return first_match
new_df = df.withColumn("first_match", find_first_match(col("tags")))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/483629.html
