我有一个数据框,里面有几列,包括 video_id
和 tags
.
我需要在我的df中创建一个新的列,叫做 occurrencias_music
字符串 "music "作为任何一个标签的子串出现的次数。不需要标签与 "music "完全相同,但必须包含它作为子串。
后来,我们的想法是实现一个 UDF subtag_music_UDF
的 IntegerType() 并将传统的python函数 subcadena_en_vector(tags)
:
from pyspark.sql import functions as F
from pyspark.sql import types as T
subtag_music_UDF = F.udf(subcadena_en_vector, T.IntegerType())
df = df.withColumn("ocurrencias_music", subtag_music_UDF(F.col("tags")))
为此,我需要一个名为 subcadena_en_vector(tags)
它应该接收一个字符串列表作为参数,并检查向量中有多少元素包含 "音乐 "这个词的子串。我必须用这个列表来测试它的操作。
["a life in music", "music for life", "bso", "hans zimmer"]
结果是2.
我有一个想法,什么是 "音乐"?subcadena_en_vector(tags)
函数可以是。
def subcadena_en_vector(tags, strToSearch):
nTimes = 0
for item in tags:
#print(item.split())
for subitem in item.split():
if subitem==strToSearch:
nTimes += 1
return nTimes
if __name__ == "__main__":
tags = ["a life in music", "music for life", "bso", "hans zimmer"]
palabra = 'music'
print(cuenta(tags,palabra)
这个函数的问题是,在后面的修正部分,其中包含了这个断言,我得到以下错误:
assert(subcadena_en_vector(["a life in music", "music for life", "bso", "hans zimmer"]) == 2)
我得到了以下错误。
> TypeErrorTraceback (most recent call last)
> <ipython-input-3-7a51ae031d9e> in <module>()
> ----> 1 assert(subcadena_en_vector(["a life in music", "music for life", "bso", "hans zimmer"]) == 2) TypeError: subcadena_en_vector()
> takes exactly 2 arguments (1 given)
有什么办法能让我简化这个函数,使它能完成出现次数的计算,而不会出现参数错误?
先谢谢你。
我终于通过这样做解决了这个问题。
from pyspark.sql import functions as F
from pyspark.sql import types as T
from pyspark.sql import Window
subtag_music = ["a life in music", "music for life", "bso", "hans zimmer"]
def subcadena_en_vector(tags):
return(sum([1 for c in tags if "music" in c]))
print(subcadena_en_vector(subtag_music))
subtag_music_UDF = F.udf(subcadena_en_vector, T.IntegerType())
videosOcurrenciasMusicDF = videosDiasViralDF.withColumn("ocurrencias_music", subtag_music_UDF(F.col("tags")))
谢谢!